小编vit*_*itm的帖子

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

我有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

c# size json http asp.net-web-api

11
推荐指数
1
解决办法
2万
查看次数

HttpResponseMessage 的处理是调用请求流的处理

我有一个方法,它采用 Stream 参数并将其传递给服务器

public async Task<string> Execute(Stream archive)
    {
        archive.Seek(0, SeekOrigin.Begin);
        using var content = new MultipartFormDataContent();
        content.Add(new StreamContent(archive), "file1", "file1");
        var result = "";
        using (var response = await _client.PostAsync(_uri, content))
        {
            if (response.IsSuccessStatusCode)
            {
                var stringResult = await response.Content.ReadAsStringAsync();
                result = stringResult;
            }
        }
        // here archive is already disposed
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

现在我实现这个方法的重试策略。如果调用此方法的外部代码得到“”结果,则它会尝试再次调用此方法。但档案是在那一刻处理的。我看到存档流在处理响应后立即被处理。为什么?如果在这个方法之后需要外部流参数怎么办?

c# httpclient .net-core httpresponsemessage

3
推荐指数
1
解决办法
971
查看次数