考虑一个用 ASP.NET Web API 编写的 Web 服务,以接受任何数量的文件作为“多部分/混合”请求。辅助方法 mat 如下所示(假设_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”标题的“名称”属性从“多部分/混合”内容中提取的。
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
但是,使用我现有的签名,将数据发布到服务器会导致InvalidOperationException
以下错误消息:
没有“MediaTypeFormatter”可用于读取媒体类型为“multipart/mixed”的“HttpRequestMessage”类型的对象。
互联网上有许多示例如何使用 ASP.NET Web API 和 HttpClient 发送和接收文件。但是,我还没有找到任何显示如何处理这个问题的方法。
我开始考虑实现一个自定义MediaTypeFormatter
并将其注册到全局配置中。然而,虽然在自定义中处理 XML 和 JSON 序列化很容易MediaTypeFormatter
,但不清楚如何处理几乎可以是任何东西的“多部分/混合”请求。