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.