Wie implementiert man einen MediaTypeFormatter richtig, um Anfragen vom Typ 'mehrteilig / gemischt' zu bearbeiten?

Stellen Sie sich einen Webdienst vor, der in der ASP.NET-Web-API geschrieben wurde, um eine beliebige Anzahl von Dateien als "Multipart / Mixed" -Anforderung zu akzeptieren. Die Hilfsmethode sieht wie folgt aus (vorausgesetzt_client ist eine Instanz vonSystem.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>

Die Methode, die die Anforderung in der Unterklasse von ApiController akzeptiert, hat eine Signatur wie folgt:

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

Im Idealfall würde ich es gerne so definieren, dass Kontakt, Quelle und Ziel anhand der 'name'-Eigenschaft des' Content-Disposition'-Headers aus dem 'multipart / mixed'-Inhalt extrahiert werden.

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

Bei meiner vorhandenen Signatur führt das Posten der Daten auf dem Server jedoch zu einemInvalidOperationException mit einer Fehlermeldung von:

Es ist kein 'MediaTypeFormatter' verfügbar, um ein Objekt vom Typ 'HttpRequestMessage' mit dem Medientyp 'multipart / mixed' zu lesen.

Im Internet gibt es eine Reihe von Beispielen für das Senden und Empfangen von Dateien mithilfe der ASP.NET-Web-API und von HttpClient. Ich habe jedoch keine gefunden, die zeigen, wie man mit diesem Problem umgeht.

Ich fing an, einen Brauch zu implementierenMediaTypeFormatter und registrieren Sie es mit der globalen Konfiguration. Es ist jedoch einfach, XML und JSON in einer benutzerdefinierten Form zu serialisierenMediaTypeFormatterEs ist unklar, wie mit "Multipart / Mixed" -Anfragen umgegangen werden soll, die so ziemlich alles sein können.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage