¿Cómo se implementa correctamente un MediaTypeFormatter para manejar solicitudes de tipo 'multipart / mixed'?
Considere un servicio web escrito en la API web de ASP.NET para aceptar cualquier número de archivos como una solicitud 'multiparte / mixta'. La estera del método auxiliar se ve como sigue (asumiendo que_client
es una instancia deSystem.Net.Http.HttpClient
):
<code>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; } </code>
El método que acepta la solicitud en la subclase de ApiController tiene una firma de la siguiente manera:
<code>public HttpResponseMessage Post(HttpRequestMessage request) { /* parse request using MultipartFormDataStreamProvider */ } </code>
Idealmente, me gustaría definirlo de esta manera, donde el contacto, la fuente y el destino se extraen del contenido 'multiparte / mixto' basado en la propiedad 'nombre' del encabezado 'Disposición de contenido'.
<code>public HttpResponseMessage Post(Contact contact, Stream source, Stream target) { // process contact, source and target } </code>
Sin embargo, con mi firma existente, la publicación de los datos en el servidor da como resultado unInvalidOperationException
con un mensaje de error de:
No hay 'MediaTypeFormatter' disponible para leer un objeto de tipo 'HttpRequestMessage' con el tipo de medio 'multipart / mixed'.
Hay varios ejemplos en Internet sobre cómo enviar y recibir archivos utilizando la API web de ASP.NET y HttpClient. Sin embargo, no he encontrado ninguno que muestre cómo tratar este problema.
Comencé a mirar implementando una costumbre.MediaTypeFormatter
y registrarlo con la configuración global. Sin embargo, si bien es fácil lidiar con la serialización de XML y JSON de forma personalizadaMediaTypeFormatter
, no está claro cómo tratar las solicitudes 'multiparte / mixtas' que pueden ser casi cualquier cosa.