在Asp.Net Core中禁用分块

Iai*_*own 16 azure-web-sites asp.net-core-mvc asp.net-core

我正在使用Asp.Net Core Azure Web App为客户端提供RESTful API,而客户端无法正确处理分块.

是否Transfer-Encoding: chunked可以在控制器级别或web.config中完全关闭?

编辑:我正在返回一个像这样的JsonResult:

[HttpPost]
[Produces( "application/json" )]
public IActionResult Post( [FromBody] AuthRequest RequestData )
{
    AuthResult AuthResultData = new AuthResult();

    return Json( AuthResultData );
}
Run Code Online (Sandbox Code Playgroud)

Pha*_*lon 8

这花了我整整一整天,但我最终想出了如何摆脱.Net Core 2.2中的分块的方法

诀窍是将响应主体读入您自己的MemoryStream中,以便获得长度。一旦这样做,就可以设置content-length标头,而IIS不会对其进行分块。我认为这也适用于Azure,但是我尚未对其进行测试。

这是中间件:

public class DeChunkerMiddleware
{
    private readonly RequestDelegate _next;

    public DeChunkerMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var originalBodyStream = context.Response.Body;
        using (var responseBody = new MemoryStream())
        {
            context.Response.Body = responseBody;
            long length = 0;
            context.Response.OnStarting(() =>
            {
                context.Response.Headers.ContentLength = length;
                return Task.CompletedTask;
            });
            await _next(context);
            //if you want to read the body, uncomment these lines.
            //context.Response.Body.Seek(0, SeekOrigin.Begin);
            //var body = await new StreamReader(context.Response.Body).ReadToEndAsync();
            length = context.Response.Body.Length;
            context.Response.Body.Seek(0, SeekOrigin.Begin);
            await responseBody.CopyToAsync(originalBodyStream);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在启动中添加:

app.UseMiddleware<DeChunkerMiddleware>();
Run Code Online (Sandbox Code Playgroud)

它必须在之前app.UseMvC()。