带有json的asp web.api的最大http请求大小

vit*_*itm 11 c# size json http asp.net-web-api

我有web api项目.

我需要将json数据与文件一起发布为编码的base64字符串(最多200 mb).

如果我发送数据大约10 MB,那么下一个方法通常会正确填充模型ImportMultipleFileModel.

[HttpPost]
    public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)
    { 
        var response = ImportFiles(importFileModel);
        return response;
    }
Run Code Online (Sandbox Code Playgroud)

如果我发送更多,则模型为空.

为什么?

所以我将方法签名更改为:

    [HttpPost]
        public async Task<HttpResponseMessage> ImportMultipleFiles()
        {
            ImportMultipleFileModel importMultipleFileModel = null;
            var requestData = await Request.Content.ReadAsStringAsync();
            try
            {
                JsonConvert.
                importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData);
            }catch(Exception e)
            { }
}
Run Code Online (Sandbox Code Playgroud)

对于编码的30 MB文件,我通常将requestData作为json字符串.对于60 mb我得到空字符串.为什么?

接下来我改变方法

    [HttpPost]
        public async Task<HttpResponseMessage> ImportMultipleFiles()
        {
            ImportMultipleFileModel importMultipleFileModel = null;
            var requestData = Request.Content.ReadAsStringAsync().Result;
            try
            {
                importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData);
            }catch(Exception e)
            { }
}
Run Code Online (Sandbox Code Playgroud)

由于OutOfMemoryException,反序列化失败.

为什么?

UPD:maxRequestLength,maxAllowedContentLength设置为2147483647

smo*_*nes 16

尝试设置maxRequestLength.

<httpRuntime targetFramework="4.5" maxRequestLength="65536" />
Run Code Online (Sandbox Code Playgroud)

或者maxAllowedContentLength(我总是对哪一个感到困惑).

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
</security>
Run Code Online (Sandbox Code Playgroud)

此外,我会重新考虑以这种方式发布数据.从MSDN阅读本文,它主要用于WCF,但我认为内容大多有效.

处理大型有效载荷的策略是流式传输.

最后一个例子的附注; .Result当你可以使用时,你不应该(或者很少)使用await.Stephen Cleary这里写了一个很好的答案.