ASP Web.API使用JSON的最大HTTP请求大小是多少?

16

我有一个Web API项目。

我需要发布json数据和文件,文件已编码为base64字符串(最大200mb)。

如果我发送的数据不超过10mb,则下一个方法通常会正确地填充模型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文件,我通常会得到JSON字符串形式的requestData。但是对于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的内存。这就是为什么您要使用流,或者拆分请求的原因。 - Callum Linington
1个回答

19

尝试设置 maxRequestLength

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

要么是maxAllowedContentLength(我总是搞混它们两个)。

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

此外,我建议您重新考虑以这种方式发布数据。请阅读这篇MSDN的文章,主要是针对WCF的,但我认为内容大多适用。

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

关于您最后一个例子的说明:当您可以使用await时,应尽量避免使用.Result。(或者很少使用)。Stephen Cleary这里写了一篇好的回答。


已经完成了。设置为2147483647。抱歉,我没有指出它。 - vitm
maxRequestLength设置解决了我的问题。 - Mark Wagoner
1
我有一个ASP.Net WebForm项目,同时也提供Web API。我使用了maxAlloweContentLength="20971520" 20MB,对于网页来说它可以正常工作,但是API请求仅支持较小的文件(最多13MB)。 - Hamid Mayeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接