asp.net-mvc - tutorial - web api rest c#
ASP.NET Web API, final inesperado de la secuencia MIME de mĂșltiples partes cuando se carga desde Flex FileReference (6)
Siguiendo el tutorial encontrado en ASP.NET, se implementó un método de controlador de API web para realizar cargas de archivos asíncronos que se ve así:
public Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
// Read the form data and return an async task.
var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith<HttpResponseMessage>(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
}
return Request.CreateResponse(HttpStatusCode.OK);
});
return task;
}
Cargar un archivo a través de un formulario HTML multiparte estándar funciona perfectamente. Sin embargo, cuando otro desarrollador intenta cargar un archivo a través de una forma multiparte construida por la clase FileReference de Flex, se produce un error:
Fin inesperado de la secuencia multiparte MIME. El mensaje multiparte MIME no está completo.
No tengo idea si el problema radica en Web API o Flex. He encontrado algún tipo de correcciones relacionadas que no tuvieron ningún efecto ( formulario POST de múltiples partes que usa ASP.Net Web API ) y, más recientemente, este ( error de transmisión múltiple MIME, el mensaje MIME multiparte no está completo) en webapi upload ). Si el segundo enlace es verdadero, ¿alguien sabe si está disponible en la versión actual de la API web disponible a través de Nuget? La discusión fue en mayo, la versión más reciente de Nuget fue agosto, así que supongo que esta solución ya se implementó y no es la causa principal de mi problema.
Acabo de eliminar mis encabezados que estaba configurando en mi método de publicación que terminó resolviendo este problema.
Asegúrese de que el directorio virtual (directorio "~ / App_Data" como el ejemplo a continuación) donde se cargan los archivos de imagen por primera vez sean físicamente existentes. Cuando publica el proyecto, puede no estar en los archivos de salida.
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
Leyendo a través de su investigación existente y siguiendo con el problema Codeplex informó que parece que alguien más confirmó que este problema aún existe en septiembre.
Creen que MVC 4 no analiza las cargas sin una terminación "/ r / n".
El problema es realmente simple pero extremadamente difícil de arreglar. El problema es que Uploadify no agrega un "/ r / n" al final del mensaje MultiPartForm
http://aspnetwebstack.codeplex.com/discussions/354215
Puede valer la pena verificar que la carga Flex agrega el "/ r / n"
Para aquellos que aterrizan aquí googleando:
Fin inesperado de la secuencia multiparte MIME. El mensaje multiparte MIME no está completo.
Leer la secuencia de solicitud más de una vez también causará esta excepción. Luché con ello durante horas hasta que encontré una fuente que explicaba que el flujo de solicitud solo podía leerse una vez.
En mi caso, combiné tratando de leer el flujo de solicitud utilizando un MultipartMemoryStreamProvider
y, al mismo tiempo, dejé que ASP.NET me hiciera magia al especificar parámetros (provenientes del cuerpo de la solicitud) para mi método api.
Tuve el mismo problema con MVC4, pero Will es correcto, agregue un nombre a su entrada .....
<input type="file" id="fileInput" name="fileInput"/>
y toda la magia está de vuelta y funcionando!
Tuve el mismo problema con flex. Y a continuación está el código que lo resolvió. Básicamente utilicé una transmisión personalizada para agregar la nueva línea que asp.net web api está esperando.
Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
MemoryStream tempStream = new MemoryStream();
reqStream.CopyTo(tempStream);
tempStream.Seek(0, SeekOrigin.End);
StreamWriter writer = new StreamWriter(tempStream);
writer.WriteLine();
writer.Flush();
tempStream.Position = 0;
StreamContent streamContent = new StreamContent(tempStream);
foreach(var header in Request.Content.Headers)
{
streamContent.Headers.Add(header.Key, header.Value);
}
// Read the form data and return an async task.
await streamContent.ReadAsMultipartAsync(provider);
Espero que esto ayude.