Considere un servicio web escrito en ASP.NET Web API para aceptar cualquier número de archivos como una solicitud 'multiparte/mixto'. La estera método de ayuda mirada como sigue (suponiendo _client
es una instancia de System.Net.Http.HttpClient
):¿Cómo se implementa correctamente un MediaTypeFormatter para manejar las solicitudes de tipo 'multipart/mixed'?
public T Post<T>(string requestUri, T value, params Stream[] streams)
{
var requestMessage = new HttpRequestMessage();
var objectContent = requestMessage.CreateContent(
value,
MediaTypeHeaderValue.Parse("application/json"),
new MediaTypeFormatter[] {new JsonMediaTypeFormatter()},
new FormatterSelector());
var content = new MultipartContent();
content.Add(objectContent);
foreach (var stream in streams)
{
var streamContent = new StreamContent(stream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data")
{
Name = "file",
FileName = "mystream.doc"
};
content.Add(streamContent);
}
return _httpClient.PostAsync(requestUri, content)
.ContinueWith(t => t.Result.Content.ReadAsAsync<T>()).Unwrap().Result;
}
El método que acepta la petición en la subclase de ApiController tiene una firma como sigue:
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
Idealmente, Me gustaría definirlo así, donde el contacto, la fuente y el objetivo se extraen del contenido 'multipart/mixed' basado en la propiedad 'name' del encabezado 'Content-Disposition'.
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
Sin embargo, con mi firma existente, la publicación de los datos a los resultados de servidor en un InvalidOperationException
con un mensaje de error de:
n 'MediaTypeFormatter' está disponible para leer un objeto de tipo ' HttpRequestMessage 'con el tipo de medio' multipart/mixed '.
Hay una serie de ejemplos en Internet sobre cómo enviar y recibir archivos utilizando ASP.NET Web API y HttpClient. Sin embargo, no he encontrado ninguno que muestre cómo tratar este problema.
Empecé a buscar la implementación de un MediaTypeFormatter
personalizado y lo registro con la configuración global. Sin embargo, si bien es fácil lidiar con la serialización de XML y JSON en un MediaTypeFormatter
personalizado, no está claro cómo lidiar con solicitudes 'multipart/mixed' que pueden ser prácticamente cualquier cosa.
parece que funciona muy bien con datos de formularios estándar, pero estoy teniendo algunos desafíos cuando la carga contiene secuencias binarias. Abandoné esta idea y analicé la carga útil como se describe [aquí] (http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime). El servicio fue alojado en IIS. – bloudraak
Las soluciones que proporcioné se aplicaban a .Net 4.5 Beta. Ahora que MS está enviando .Net 4.5RC, existe una forma similar pero más limpia de manejar datos binarios. Consulte esta publicación en el blog: http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html – Jed