Wie implementiert man einen MediaTypeFormatter korrekt, um Anfragen vom Typ 'multipart / mixed' zu behandeln?
Betrachten ein web service geschrieben ASP.NET Web-API akzeptiert eine beliebige Anzahl von Dateien als "multipart/mixed" - Anforderung. Die helper-Methode mat wie folgt Aussehen (unter der Annahme _client
ist eine Instanz von System.Net.Http.HttpClient
):
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;
}
Die Methode, die die Anforderung akzeptiert, in der Unterklasse von ApiController hat eine Signatur wie folgt:
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
Im Idealfall würde ich mag, um zu definieren, wie diese, in denen Kontakt, Quelle und Ziel sind entnommen aus den 'multipart/mixed' - Inhalt auf der Grundlage der 'name' - Eigenschaft des 'Content-Disposition" - header.
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
//process contact, source and target
}
Allerdings mit meiner bereits vorhandenen Unterschrift, Veröffentlichung die Daten an die server-Ergebnisse in eine InvalidOperationException
mit einer Fehlermeldung:
Kein 'MediaTypeFormatter' Lesen Sie ein Objekt vom Typ
'HttpRequestMessage' mit dem media-type 'multipart/mixed'.
Gibt es eine Reihe von Beispielen, die auf das internet zum senden und empfangen von Dateien über das ASP.NET Web-API und HttpClient. Allerdings habe ich keine gefunden, die zeigen, wie mit diesem problem umzugehen.
Schaute ich mir die Implementierung einer benutzerdefinierten MediaTypeFormatter
und registrieren Sie es mit der globalen Konfiguration. Jedoch, während es ist leicht zu Bearbeiten serialisieren von XML-und JSON in eine benutzerdefinierte MediaTypeFormatter
es ist unklar, wie man mit 'multipart/mixed' Anfragen, die können so ziemlich alles sein.
InformationsquelleAutor der Frage bloudraak | 2012-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf dieses forum: http://forums.asp.net/t/1777847.aspx/1?MVC4+Beta+Web+API+und+mehrteilige+form+Daten
Hier ist ein code-snippet (geschrieben von imran_ku07), die helfen könnten, Sie implementieren eine benutzerdefinierte formatter-Griff multipart/form-data:
Anschließend müssen Sie dieses Formatierungsprogramm auf Ihre Bewerbung. Wenn dabei self-host können Sie einfach fügen Sie es hinzu, indem einschließlich:
vor dem instanziieren der HttpSelfHostServer Klasse.
-- EDIT --
Analysieren Binär-streams benötigen Sie ein anderes Formatierungsprogramm. Hier ist eine, die ich benutze, um analysieren Bilder in einem von meinen Projekten arbeiten.
In Ihrem controller/action, Sie wollen zu tun, etwas entlang der Linien von:
InformationsquelleAutor der Antwort Jed
Werfen Sie einen Blick auf diese post https://stackoverflow.com/a/17073113/1944993 die Antwort von Kiran Challa ist wirklich schön!
Den wesentlichen Teil :
Custom In-memory-MultiaprtFormDataStreamProvider:
Können Sie dann die "MemoryMultiPartDataStreamProvider" webapi wie diese :
InformationsquelleAutor der Antwort HoefMeistert