在Asp.Net Core

时间:2016-06-22 10:59:30

标签: asp.net-core asp.net-core-mvc azure-web-sites

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

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

编辑:我回复JsonResult有点像这样:

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

    return Json( AuthResultData );
}

4 个答案:

答案 0 :(得分:5)

这花了我整整一整天,但我最终想出了如何摆脱.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);
        }
    }
}

然后将其添加到启动中:

app.UseMiddleware<DeChunkerMiddleware>();

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

答案 1 :(得分:2)

在ASP.NET核心中,这似乎适用于主机:

response.Headers["Content-Encoding"] = "identity";
response.Headers["Transfer-Encoding"] = "identity";
  

表示身份功能(即没有压缩,也没有   修改)。除非明确指定,否则此标记始终为   被认为可接受

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding

当您明确禁用响应缓冲时,这也有效:

var bufferingFeature = httpContext.Features.Get<IHttpBufferingFeature>();
bufferingFeature?.DisableResponseBuffering();

答案 2 :(得分:0)

它在.NET Core 2.0中工作。只需设置ContentLength,然后再将结果写入响应主体流即可。

内部启动类:

app.Use(async (ctx, next) =>
{
    var stream = new xxxResultTranslatorStream(ctx.Response.Body);
    ctx.Response.Body = stream;

    await Run(ctx, next);

    stream.Translate(ctx);
    ctx.Response.Body = stream.Stream;
});

Int xxxResultTranslatorStream:

ctx.Response.Headers.ContentLength=40;
stream.Write(writeTargetByte, 0, writeTargetByte.Length);

答案 3 :(得分:0)

我发现,如果我只是从Get()返回FileStream并让ASP.NET处理其余部分,我所有的分块问题都会消失,

如果您只是放弃控制并信任它们,Microsoft软件往往会发挥最佳作用。如果您实际上试图控制该过程,它的工作效果可能最差。