为什么写入正文后更改状态码 returns 504?

Why changing the status code after writing to the body returns 504?

在 ASP.NET 5 中,我发现以下代码在响应中给出错误 504:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use((next) => {

            return async (context) => {

                context.Response.StatusCode = 200;
                await context.Response.WriteAsync("Hello World");
                context.Response.StatusCode = 201;
                await context.Response.WriteAsync("Status code changed");

            };

        });
    }
}

我知道我们不应该以这种任意方式更改状态代码,但我的问题是:为什么更改它会出现问题?事实是,注释更改状态代码的行,并使用 Response.WriteAsync 两次,不会出现任何问题,但更改状态代码会出现问题。

当我们这样做时 returns 504 状态代码。我认为这与将响应发送给客户端的方式有关。发生这种情况是因为当我们调用 Respose.WriteAsync 时,响应消息已经开始发送了吗?出现此错误的原因是什么?

Headers 在内容写入响应 body 流时发送,因此您不能再次更改 headers ...因此,如果您再次设置状态代码, 然后可能在中间件中抛出一个异常来指示这个...

顺便说一句,这个异常会导致您看到的 504(就像目前没有响应缓冲层可以捕获此类异常和 returns 带有错误消息的 500 内部服务器)...您可以放置​​一个 try-catch 块来捕获异常消息并查看其内容..