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在这里写了一个很好的答案.