Como um corretamente implementa um MediaTypeFormatter para manipular solicitações do tipo 'multipart / mixed'?
Considere um serviço da Web escrito na API da Web do ASP.NET para aceitar qualquer número de arquivos como uma solicitação 'multiparte / mista'. A esteira do método auxiliar se parece com a seguinte (assumindo_client
é uma instância 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>
O método que aceita o pedido na subclasse de ApiController tem uma assinatura da seguinte forma:
<code>public HttpResponseMessage Post(HttpRequestMessage request) { /* parse request using MultipartFormDataStreamProvider */ } </code>
Idealmente, eu gostaria de defini-lo assim, onde contato, origem e destino são extraídos do conteúdo 'multipart / misto' baseado na propriedade 'nome' do cabeçalho 'Content-Disposition'.
<code>public HttpResponseMessage Post(Contact contact, Stream source, Stream target) { // process contact, source and target } </code>
No entanto, com minha assinatura existente, postar os dados no servidor resulta emInvalidOperationException
com uma mensagem de erro de:
Nenhum 'MediaTypeFormatter' está disponível para ler um objeto do tipo 'HttpRequestMessage' com o tipo de mídia 'multipart / mixed'.
Há vários exemplos na Internet sobre como enviar e receber arquivos usando a API da Web do ASP.NET e o HttpClient. No entanto, eu não encontrei nenhum que mostre como lidar com esse problema.
Comecei a procurar implementar um costumeMediaTypeFormatter
e registre-o com a configuração global. No entanto, embora seja fácil lidar com a serialização de XML e JSON em umMediaTypeFormatter
, não está claro como lidar com solicitações 'multipart / mixed' que podem ser praticamente qualquer coisa.