为什么在写入正文后更改状态代码会返回504?

use*_*696 2 c# owin asp.net-core

在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");

            };

        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kir*_*lla 5

当内容被写入响应正文流时,会发送标题,因此您无法再次更改标题...因此,如果您再次设置状态代码,那么可能会在中间件中抛出异常以指示此...

BTW这个异常会导致你看到的504(就像目前没有响应缓冲层可以捕获这些异常并返回500内部服务器并显示错误消息)...你可以放一个try-catch块来捕获异常消息,看看它说的是什么..