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
):
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;
}
Metoda, która akceptuje żądanie w podklasie ApiController, ma następujący podpis:
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
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”.
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
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.