2012-04-03 30 views
6

我試圖讓一個控制檯應用程序向ASP.NET MVC 3中開發的Web應用程序發送XML文件,並接收另一個XML作爲響應。如何從控制檯應用程序上傳文件到ASP.NET MVC

在控制檯應用程序返回的錯誤是:

The remote server returned an error: (500) Internal Server Error.

當我Fiddler2運行,我看到這個錯誤:

Object reference not set to an instance of an object.

在控制檯應用程序中的代碼是:

static void Main(string[] args) 
{ 
    var wc = new WebClient(); 
    byte[] response = wc.UploadFile("http://mysite.com/Tests/Test", "POST", "teste.xml"); 
    string s = System.Text.Encoding.ASCII.GetString(response); 
    Console.WriteLine(s); 
    Console.ReadKey(); 
} 

MVC控制器中的代碼是:

[HttpPost] 
public ActionResult Test(HttpPostedFileBase file) 
{ 
    XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream)); 
    var test = new MyTest(); 
    return File(test.RunTest(xml), "text/xml", "testresult.xml"); 
} 

RunTest()工作的很好,因爲這種方法工作時,我通過窗體上傳文件(在一個具有相同名稱的方法,使用方法GET)。 RunTest()返回帶有響應的XML。

當我調試MVC應用程序時,我看到問題:變量file爲空!

我該如何解決這個問題?我在控制檯應用程序中需要更改哪些內容才能真正發送文件?或者是否改變MVC方法?

而且,在嘗試使用WebClient之前,我在此嘗試了此代碼:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx,並得到了相同的結果。

回答

6

你的問題是WebClient.UploadFile沒有發佈一個窗體,enctype被設置爲multipart/form-data使用名爲「file」的輸入來映射到MVC。嘗試將您的服務器端方法更改爲:

[HttpPost] 
public ActionResult Test() 
{ 
    var file = Request.Files[0] as HttpPostedFile; 
    XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream)); 
    var test = new MyTest(); 
    return File(test.RunTest(xml), "text/xml", "testresult.xml"); 
} 
+1

它的工作!我只需要刪除'作爲HttpPostedFile',它不是編譯...非常感謝! – 2012-04-03 22:40:59

+0

感謝隊友,幫助我! – f0x 2012-04-24 21:13:25

0

萬一有人有略有不同但相關的問題:

我也有使用,而不是UploadFile功能UploadData做到這一點。在這種情況下,而不是在控制器寫着:

var file = Request.Files[0] as HttpPostedFile; 
XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream)); 

人們可以簡單地寫:

XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream)); 

容易! ;)

相關問題