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();
});