2012-04-03 30 views
6

Tôi đang cố gắng để có một ứng dụng giao diện điều khiển để gửi một tệp XML tới một ứng dụng web được phát triển trong ASP.NET MVC 3 và nhận một XML khác làm phản hồi .Cách tải tệp lên ASP.NET MVC từ ứng dụng bảng điều khiển

Lỗi được thông báo trong ứng dụng giao diện điều khiển là:

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

Khi tôi nhận được Fiddler2 chạy, tôi thấy lỗi này:

Object reference not set to an instance of an object.

Mã trong việc áp dụng giao diện điều khiển là:

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(); 
} 

Mã trong Bộ điều khiển MVC là:

[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() hoạt động tốt, vì phương pháp này hoạt động khi tôi tải tệp lên qua biểu mẫu (trong phương thức có cùng tên, sử dụng phương thức GET). RunTest() trả về XML bằng phản hồi.

Khi tôi gỡ lỗi ứng dụng MVC, tôi thấy sự cố: biến số file là null!

Làm cách nào để khắc phục điều đó? Tôi phải thay đổi gì trong ứng dụng giao diện điều khiển của mình để thực sự gửi tệp? Hay là trường hợp thay đổi phương pháp MVC?

Và trước khi thử sử dụng WebClient, tôi đã thử mã này tại đây: http://msdn.microsoft.com/en-us/library/debx8sh9.aspx và có cùng kết quả.

Trả lời

6

Vấn đề của bạn là WebClient.UploadFile không đăng biểu mẫu với bộ mã hóa được đặt thành nhiều phần/biểu mẫu-dữ liệu bằng cách sử dụng đầu vào có tên "tệp" cho MVC để ánh xạ tới. Hãy thử thay đổi phương thức phía máy chủ của bạn thành phương thức này:

[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

Đã hoạt động! Tôi chỉ cần xóa 'as HttpPostedFile', nó không được biên dịch ... Cảm ơn bạn rất nhiều! –

+0

cảm ơn bạn đời, đã giúp tôi! – f0x

0

Bạn cần chuyển tên cho thông số bằng tệp được tải lên. Điều này là không thể với WebClient.

Kiểm tra

How to specify form parameter when using webclient to upload file

Send multipart/form-data content type request

+0

Liên kết đẹp; bằng cách này, liên kết không cần phải làm việc với một biểu mẫu, chỉ với yêu cầu này, vì vậy câu trả lời của Chris chỉ là những gì tôi cần. Nhưng dù gì cũng cảm ơn! =) –

0

Trong trường hợp ai đó có hơi khác nhau nhưng có liên quan vấn đề:

Tôi cũng đã phải làm điều đó bằng cách sử dụng chức năng UploadData thay vì UploadFile. Trong trường hợp này, thay vì viết trong bộ điều khiển:

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

Một cách đơn giản có thể viết:

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

dễ dàng hơn! ;)

Các vấn đề liên quan