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

Posted

技术标签:

【中文标题】带有 json 的 asp web.api 的最大 http 请求大小【英文标题】:Maximum http request size for asp web.api with json 【发布时间】:2016-11-28 12:31:50 【问题描述】:

我有 web api 项目。

我需要将带有文件的 json 数据发布为编码的 base64 字符串(最大 200 mb)。

如果我发送的数据最大约为 10 mb,那么下一个方法通常会得到正确填充的模型 ImportMultipleFileModel。

[HttpPost]
    public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)
     
        var response = ImportFiles(importFileModel);
        return response;
    

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

为什么?

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

    [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)
             

对于编码的 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)
             

由于 OutOfMemoryException 而反序列化失败。

为什么?

更新: maxRequestLength, maxAllowedContentLength 设置为 2147483647

【问题讨论】:

它试图将 60mb 的字符串序列化为一个不允许这样做的结构。您不希望以任何方式为每个请求保留 60mb 的内存。这就是您要么使用流,要么拆分请求的原因 【参考方案1】:

尝试设置maxRequestLength

<httpRuntime targetFramework="4.5" maxRequestLength="65536" />

或者maxAllowedContentLength(我总是搞不清哪个是哪个)。

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
</security>

另外,我会重新考虑以这种方式发布数据。阅读this article form MSDN,主要是针对WCF的,但我认为内容大多是有效的。

处理大负载的策略是流式传输。

最后一个例子的旁注;当您可以使用await 时,您不应该(或者可能很少)使用.Result。 Stephen Cleary 写了一个很好的答案 here。

【讨论】:

已经完成了。设置为 2147483647。抱歉,我没有指出。 maxRequestLength 设置为我解决了这个问题 我有一个 ASP.Net WebForm 项目,它也提供 Web API。我使用了maxAlloweContentLength="20971520" 20MB,它适用于网页,而 API 请求仅支持较小的文件(最大 13MB)。

以上是关于带有 json 的 asp web.api 的最大 http 请求大小的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

ASP.NET Web API - 模型绑定不适用于 POST 上的 XML 数据

使用 ASP.NET Web API 返回 JSON 文件

ASP.NET Web API:JSON 序列化循环引用

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

ASP.Net WEB API 无法 POST 来自移动设备的大型 JSON 数据