在WebAPI请求正文

时间:2017-05-24 14:38:45

标签: c# asp.net-web-api

我需要提出一个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]并将Param1Param2作为查询字符串参数传递,那么一切正常。

但我真的需要从请求体中获取这些参数。更糟糕的是,我必须接受它们作为FormData和JSON,我不知道它们将以什么顺序传递给请求。 (所以我不能总是确定streamProvider.Contents[0]是二进制文件而streamProvider.Contents[1]是JSON)。如何使WebAPI正确绑定这些身体参数?

0 个答案:

没有答案