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.

questionAnswers(2)

yourAnswerToTheQuestion