2012-04-03 23 views
6

Estoy tratando de tener una aplicación de consola para enviar un archivo XML a una aplicación web desarrollada en ASP.NET MVC 3, y recibir otro XML como respuesta .Cómo cargar un archivo a ASP.NET MVC desde una aplicación de consola

El error devuelto en la aplicación de consola es:

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

Cuando llego Fiddler2 corriendo, veo este error:

Object reference not set to an instance of an object.

El código de la aplicación de consola es:

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

El código en el controlador MVC es:

[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() funciona bien, ya que este método funciona cuando cargo el archivo a través del formulario (en un método con el mismo nombre, usando el método GET). RunTest() devuelve el XML con la respuesta.

Cuando depuro la aplicación MVC, veo el problema: ¡la variable file es nula!

¿Cómo puedo solucionar eso? ¿Qué debo cambiar en la aplicación de mi consola para que realmente envíe un archivo? ¿O es el caso cambiar el método MVC?

Y, antes de intentar usar WebClient, probé este código aquí: http://msdn.microsoft.com/en-us/library/debx8sh9.aspx, y tuve los mismos resultados.

Respuesta

6

Su problema es que WebClient.UploadFile no está publicando un formulario con el enctype establecido en multipart/form-data usando una entrada llamada "archivo" para que MVC se asigne. Intente cambiar el método del lado del servidor a este:

[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

¡Funcionó! Solo necesitaba eliminar 'como HttpPostedFile', no estaba compilando ... ¡Muchas gracias! –

+0

gracias amigo, ¡ayúdame! – f0x

0

En caso de que alguien tiene la poco diferente, pero relacionado con un problema:

También tuve que hacerlo utilizando la función UploadData en lugar de UploadFile. En este caso, en lugar de escribir en el controlador:

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

Uno simplemente puede escribir:

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

más fácil! ;)

Cuestiones relacionadas