ASP.Net Core 2.0 API 响应因 json 负载较大而挂起

ASP.Net Core 2.0 API Response hangs with large json payload

我正在开发 ASP Net Core 2.0 Web API。我的端点之一 return 是一个 json 对象,其中包含一个可能相当大的文本字段。当这个字段的大小达到 10Mb 左右时,控制器就会停止,直到超时。当我调试时,我看到 json 对象是在我的业务逻辑中创建的并传递给端点控制器,但是控制器在收到 json 对象后立即停止,没有错误并且没有 return 给调用者,直到请求最终超时。我将我的 requestTimeout 增加到 20 分钟,即使业务逻辑在不到 2 分钟的时间内生成了 json 对象。它只是挂起,直到达到 20 分钟超时。

这是我的控制器操作;

[示例 1]

    [HttpGet(Name = "GetFile")]
    public async Task<FileResponseDto> GetFile([FromRoute] int companyId, [FromRoute] int siteId, [FromRoute] int FileId, 
        [FromHeader(Name = "Accept")] string mediaType, CancellationToken cancellationToken)
    {
        var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

        // This is the point where the controller appears to hang

        return await Task.Factory.StartNew(() => fileResponseDto, cancellationToken);

    }

和我的 DTO 对象;

public class FileResponseDto
{
    public string ReferenceId { get; set; }
    public string Filename { get; set; }
    public string ProcessingFile { get; set; }
}

大字符串的属性是FileResponseDtoclass.

中的ProcessingFile属性

这在我的 ProcessingFile 属性 达到大约 30K 行(大约 10Mb)之前工作正常,然后控制器在完成该行后挂起;

var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

此时,我的假设是我在 json 对象的大小上遇到了一些限制。因此,为了进行测试,我更改了我的控制器,使其 return 成为一个文件,如下所示;

[示例 2]

    [HttpGet(Name = "GetFile")]
    public async Task<FileContentResults> GetFile([FromRoute] int companyId, [FromRoute] int siteId, [FromRoute] int fileId, 
        [FromHeader(Name = "Accept")] string mediaType, CancellationToken cancellationToken)
    {
        var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

        var outputFile = Encoding.ASCII.GetBytes(fileResponseDto.ProcessingFile);

        return await Task.Factory.StartNew(() =>
            new FileContentResult(outputFile, new MediaTypeHeaderValue(MediaTypeNames.Application.Octet))
            {
                FileDownloadName = fileResponseDto.Filename
            }, cancellationToken);

    }

如果我在 Postman select "Send and Download" 中进行此更改,我可以收到一个文件下载对话框弹出窗口和一个成功的文件。

因此,这让我相信第一个示例中传输的 json 对象与大小有关。

然而,网络搜索并没有在这个问题上找到任何有用的东西,这让我觉得我可能在这里遗漏了一些东西。

我确实找到了 this link in Whosebug 并尝试使用...

var outfileJson = JsonConvert.SerializeObject<fileResponseDto>;

outfileJson.MaxJsonLength = Int32.MaxValue;

但是 outfileJson 没有 MasJsonLength 属性。

那么..有什么想法吗?

编辑 2018 年 6 月 8 日

2 天后,有 22 次浏览,没有实际回复。我认为我的方法一定有问题。我意识到我没有提到我在 Postman 中执行这些测试,而这正是我看到问题的地方。进一步挖掘后,我发现了一个 post on GitHub 似乎与我在 Postman 中遇到的问题有关(大响应负载挂起)。 Postman 似乎对响应中的 "rows" 和 return 的数量有限制。 GitHub post 是增加行数的功能请求。

我现在不确定如何处理这个 Whosebug 问题。由于我在原文 post 中没有提到 Postman,我觉得只回答我自己的问题是不对的。所以,我想我会保持原样几天,看看在我这样做之前是否有人同意他们的想法。

事实证明,这实际上是 Postman 及其当前支持的响应负载大小的问题。如果,而不是 selecting 发送,我 select 在 Postman 中发送和下载,它将下载 JSON 对象并弹出一个对话框,允许我将它保存到我的本地驱动器.然后,当我检查该文件时,我可以看到 json 对象的格式和传输是正确的。

我通过在 .Net 客户端应用程序中执行 API 调用确认这只是 Postman 问题而不是 .NET HttpResponse 问题,它能够接收 Json 对象而无需错误。