【发布时间】:2012-04-19 15:44:37
【问题描述】:
考虑使用 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 并将其注册到全局配置中。然而,虽然在自定义 MediaTypeFormatter 中序列化 XML 和 JSON 很容易,但不清楚如何处理几乎可以是任何东西的“多部分/混合”请求。
【问题讨论】: