【发布时间】: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