在控制器中完成后,我try 修改一些中间件中的响应头,但收到错误消息:

System.InvalidOperationException: Headers are read-only, response has already started.
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowHeadersReadOnlyException()
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value)
   at EditResponseMiddleware.InvokeAsync(HttpContext context) in

控制器是默认的WeatherForecast控制器,此处不包括该控制器.

以下是触发异常的代码:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseMiddleware<EditResponseMiddleware>();

app.UseAuthorization();

app.MapControllers();

app.Run();

public class EditResponseMiddleware
{
    private readonly RequestDelegate _next;

    public EditResponseMiddleware( RequestDelegate next )
    {
        _next = next;
    }
    
    public async Task InvokeAsync( HttpContext context )
    {
        await _next( context );
        
        context.Response.Headers["MyHeader"] = "Test";
    }
}

有没有解决这个问题的办法,或者我们现在不打算修改响应的任何部分?

推荐答案

在将任何内容写入响应体之后,不能设置响应头.一旦您将请求传递给下一个中间件并写入响应,那么中间件就不能再次设置响应头.

下面是一个OnStarting method,它添加了一个要在将响应头发送到客户端之前调用的委托.此处注册的回调以相反的顺序运行.因此,您可以将代码更改为:

public async Task InvokeAsync(HttpContext context)
        {
            context.Response.OnStarting(() =>
            {             
                context.Response.Headers["MyHeader"] = "Test";
                return Task.CompletedTask;
            });

            await _next(context);       
        }

enter image description here

Csharp相关问答推荐

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

当打印一行x个项目时,如何打印最后一行项目?

react 式扩展连接中的非交叉LeftDurationTimeout

如何在C#中删除一个特殊字符,如"使用Regex"

属性getter和setter之间的空性不匹配?

如何注销Microsoft帐户?

Select Many和默认IfEmpty内部Select Many错误工作

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

当用户右键单击文本框并单击粘贴时触发什么事件?

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

有条件地定义预处理器指令常量

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

多个选项卡上的MudForm验证

将C#类导入到PowerShell

C#Microsoft.CodeAnalysis.CSharp.Scriiting不等待并行.对于

毛伊岛.NET 8图片不再适合按钮

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

无法使用直接URL通过PictureBox.ImageLocation加载图像