.NET 性能最佳做法:在响应正文启动后请勿修改状态代码或标头

ASP.NET Core 不会缓冲 HTTP 响应正文。首次写入响应时:

  • 标头与正文的该区块一起发送到客户端。

  • 无法再更改响应标头。

请勿这样做:下面的代码尝试在响应已启动之后添加响应标头:.

app.Use(async (context, next) =>{    await next();
    context.Response.Headers["test"] = "test value";});

在上面的代码中,如果将 next() 写入响应,则 context.Response.Headers["test"] = "test value"; 会引发异常。

请这样做:下面的示例在修改标头之前检查 HTTP 响应是否已启动。

app.Use(async (context, next) =>{    await next();
    if (!context.Response.HasStarted)    {        context.Response.Headers["test"] = "test value";    }});
请这样做:下面的示例使用 在将响应标头刷新到客户端之前设置标头。
通过检查响应是否未启动,可以在写入响应标头之前注册将调用的回调。检查响应是否未启动:
  • 提供实时追加或替代标头的能力。

  • 不需要了解管道中的下一个中间件。

app.Use(async (context, next) =>{    context.Response.OnStarting(() =>    {        context.Response.Headers["someheader"] = "somevalue";        return Task.CompletedTask;    });
    await next();});