【问题标题】:Maximum http request size for asp web.api with json带有 json 的 asp web.api 的最大 http 请求大小
【发布时间】: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 的内存。这就是您要么使用流,要么拆分请求的原因

标签: c# json http asp.net-web-api size


【解决方案1】:

尝试设置maxRequestLength

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

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

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

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

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

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

【讨论】:

  • 已经完成了。设置为 2147483647。抱歉,我没有指出。
  • maxRequestLength 设置为我解决了这个问题
  • 我有一个 ASP.Net WebForm 项目,它也提供 Web API。我使用了maxAlloweContentLength="20971520" 20MB,它适用于网页,而 API 请求仅支持较小的文件(最大 13MB)。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2016-05-04
相关资源
最近更新 更多