Jak poprawnie zaimplementować MediaTypeFormatter do obsługi żądań typu „multipart / mixed”?

Rozważmy usługę WWW napisaną w ASP.NET Web API, aby akceptować dowolne pliki liczbowe jako żądanie „wieloczęściowe / mieszane”. Mata metody pomocniczej wygląda następująco (zakładając_client jest przykłademSystem.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>

Metoda, która akceptuje żądanie w podklasie ApiController, ma następujący podpis:

<code>public HttpResponseMessage Post(HttpRequestMessage request)
{
    /* parse request using MultipartFormDataStreamProvider */
}
</code>

W idealnej sytuacji chciałbym zdefiniować to w taki sposób, w którym kontakt, źródło i cel są wyodrębniane z treści „wieloczęściowej / mieszanej” na podstawie właściwości „nazwa” nagłówka „Skład-zawartości”.

<code>public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
    // process contact, source and target
}
</code>

Jednak dzięki mojemu istniejącemu podpisowi publikowanie danych na serwerze skutkujeInvalidOperationException z komunikatem o błędzie:

„MediaTypeFormatter” nie jest dostępny do odczytu obiektu typu „HttpRequestMessage” z typem nośnika „multipart / mixed”.

W Internecie dostępnych jest wiele przykładów wysyłania i odbierania plików za pomocą interfejsu API ASP.NET Web i HttpClient. Jednak nie znalazłem żadnego, który pokazywałby, jak radzić sobie z tym problemem.

Zacząłem przyglądać się wprowadzaniu zwyczajuMediaTypeFormatter i zarejestruj go w konfiguracji globalnej. Jednakże, podczas gdy łatwo jest poradzić sobie z serializacją XML i JSON w niestandardowymMediaTypeFormatter, nie jest jasne, jak radzić sobie z wnioskami „wieloczęściowymi / mieszanymi”, które mogą w zasadzie być czymkolwiek.

questionAnswers(2)

yourAnswerToTheQuestion