ASP.NET Web APIで記述されたWebサービスを考えて、任意の数のファイルを「マルチパート/混合」要求として受け入れます。_client
ヘルパーメソッドのマットは次のようになります(のインスタンスであると想定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;
}
ApiControllerのサブクラスでリクエストを受け入れるメソッドには、次のようなシグネチャがあります。
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
理想的には、このように定義したいと思います。ここで、連絡先、ソース、およびターゲットは、「Content-Disposition」ヘッダーの「name」プロパティに基づいて「multipart/mixed」コンテンツから抽出されます。
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
ただし、既存の署名では、データをサーバーに投稿するInvalidOperationException
と、次のエラーメッセージが表示されます。
メディアタイプが「multipart/mixed」のタイプ「HttpRequestMessage」のオブジェクトを読み取るために使用できる「MediaTypeFormatter」はありません。
インターネット上には、ASP.NETWebAPIとHttpClientを使用してファイルを送受信する方法の例がいくつかあります。しかし、私はこの問題に対処する方法を示すものを見つけていません。
カスタムの実装を検討し始め、MediaTypeFormatter
それをグローバル構成に登録しました。ただし、カスタムでXMLとJSONのシリアル化を処理するのは簡単ですがMediaTypeFormatter
、「マルチパート/混合」要求を処理する方法は不明です。これはほとんど何でもかまいません。