Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带json的asp web.api的最大http请求大小_C#_Json_Http_Asp.net Web Api_Size - Fatal编程技术网

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

C# 带json的asp web.api的最大http请求大小,c#,json,http,asp.net-web-api,size,C#,Json,Http,Asp.net Web Api,Size,我有一个web api项目 我需要将json数据和文件一起作为编码的base64字符串(最大200MB)发布到那里 若我将数据发送到大约10MB,那个么下一个方法通常会得到正确填充的model ImportMultipleFileModel [HttpPost] public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)

我有一个web api项目

我需要将json数据和文件一起作为编码的base64字符串(最大200MB)发布到那里

若我将数据发送到大约10MB,那个么下一个方法通常会得到正确填充的model ImportMultipleFileModel

[HttpPost]
    public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)
    { 
        var response = ImportFiles(importFileModel);
        return response;
    }
[HttpPost]
公共异步任务ImportMultipleFiles(ImportMultipleFileModel ImportMultipleFileModel)
{ 
var响应=导入文件(导入文件模型);
返回响应;
}
如果我发送更多,则模型为空

为什么?

因此,我将方法签名更改为:

    [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)
            { }
}
[HttpPost]
公共异步任务ImportMultipleFiles()
{
ImportMultipleFileModel ImportMultipleFileModel=null;
var requestData=await Request.Content.ReadAsStringAsync();
尝试
{
JsonConvert。
importMultipleFileModel=JsonConvert.DeserializeObject(requestData);
}捕获(例外e)
{ }
}
对于编码的30MB文件,我通常以json字符串的形式获取requestData。对于60MB,我得到了空字符串。 为什么?

接下来我将方法更改为

    [HttpPost]
        public async Task<HttpResponseMessage> ImportMultipleFiles()
        {
            ImportMultipleFileModel importMultipleFileModel = null;
            var requestData = Request.Content.ReadAsStringAsync().Result;
            try
            {
                importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData);
            }catch(Exception e)
            { }
}
[HttpPost]
公共异步任务ImportMultipleFiles()
{
ImportMultipleFileModel ImportMultipleFileModel=null;
var requestData=Request.Content.ReadAsStringAsync().Result;
尝试
{
importMultipleFileModel=JsonConvert.DeserializeObject(requestData);
}捕获(例外e)
{ }
}
由于OutOfMemoryException,反序列化失败

为什么?

UPD: maxRequestLength,maxAllowedContentLength设置为2147483647

尝试设置

此外,我会重新考虑以这种方式发布数据。阅读,主要是针对WCF,但我认为内容基本上是有效的

处理大型有效负载的策略是流式传输


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

它试图将60mb的字符串序列化到一个不允许这种情况的构造中。无论如何,您都不希望每个请求都有60mb的内存。这就是为什么您要么使用流,要么拆分已经完成的请求。设置为2147483647。抱歉,我没有指出。maxRequestLength设置修复了meI的ASP.NETWebForm项目的问题,该项目也提供了Web API。我使用了
maxAlloweContentLength=“20971520”
20MB,它可以很好地用于网页,而API请求只支持较小的文件(高达13MB)。
<httpRuntime targetFramework="4.5" maxRequestLength="65536" />
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
</security>