我需要提出一个ASP.NET WebAPI方法,该方法接受包含上传文件和一些其他参数的请求。此请求的C#模型如下:
public class MyRequestViewModel
{
public byte[] ZipArchive { get; set; }
public string Param1 { get; set; }
public string Param2 { get; set; }
}
我需要能够接受以下请求:
表单数据请求正文示例:
-----------------------------8198313082943
Content-Disposition: form-data; name="File"; filename="invoice.zip"
Content-Type: application/x-zip-compressed
PK....<long uploded file data>
-----------------------------8198313082943
Content-Disposition: form-data; name="Param1"
1
-----------------------------8198313082943
Content-Disposition: form-data; name="Param2"
2
-----------------------------8198313082943--
JSON 请求正文示例:
-----------------------------8198313082943
Content-Disposition: form-data; name="File"; filename="invoice.zip"
Content-Type: application/x-zip-compressed
PK....<long uploded file data>
-----------------------------8198313082943
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json
{"Param1": "1", "Param2": "2"}
-----------------------------8198313082943--
到目前为止,我已经尝试编写这样的WebAPI方法:
[HttpPost]
public async Task<HttpResponseMessage> UploadStuff([FromBody] MyRequestViewModel request)
{
if (!this.Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var streamProvider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(streamProvider);
request.ZipArchive = await streamProvider.Contents.FirstOrDefault()?.ReadAsByteArrayAsync();
return Process(request);
}
但是当我尝试上传文件时,我收到以下错误:
不支持请求实体的媒体类型“multipart / form-data” 对于这个资源。
似乎WebAPI不知道如何将请求主体绑定到MyRequestViewModel
。如果我将[FromBody]
更改为[FromUri]
并将Param1
和Param2
作为查询字符串参数传递,那么一切正常。
但我真的需要从请求体中获取这些参数。更糟糕的是,我必须接受它们作为FormData和JSON,我不知道它们将以什么顺序传递给请求。 (所以我不能总是确定streamProvider.Contents[0]
是二进制文件而streamProvider.Contents[1]
是JSON)。如何使WebAPI正确绑定这些身体参数?