Asp.net core 如何在ASP.NET 5中拦截所有其他中间件之后的响应?
在我的应用程序中,我需要为几乎所有的响应添加一个标题 但是,中间件不会为我解决这个问题,因为其他一些中间件设置了一个全新的响应,结束了管道,我没有看到:Asp.net core 如何在ASP.NET 5中拦截所有其他中间件之后的响应?,asp.net-core,Asp.net Core,在我的应用程序中,我需要为几乎所有的响应添加一个标题 但是,中间件不会为我解决这个问题,因为其他一些中间件设置了一个全新的响应,结束了管道,我没有看到: app.Use((context, next) => { context.Response.Headers.Add("MyHeader", "IsCool"); return next(); }); app.UseSomeOtherMiddleware(); // This ends the pipeline after
app.Use((context, next) =>
{
context.Response.Headers.Add("MyHeader", "IsCool");
return next();
});
app.UseSomeOtherMiddleware(); // This ends the pipeline after removing my `MyHeader`
我无法在出现问题的中间件之后添加另一个中间件,因为管道已经完成
我可以为它添加一个web.config
条目:
但正如我所说,几乎所有的回应都需要加入这一点。我只需要一点逻辑来确定是否添加它,而web.config
解决方案无法满足我的需要
那么如何在ASP.NET 5中实现这一点呢?在所有事情都应该完成之后,我如何进入管道?我想我通过创建一个中间件解决了这个问题,如下所示:
public class MyMiddleware
{
RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next(context);
context.Response.Headers.Add("MyHeader", "IsCool");
}
}
并在Startup.cs
中使用以下命令:
app.UseMiddleware<MyMiddleware>();
app.UseMiddleware();
您可以使用HttpContext.Response.on注册回调,并在发送头之前修改头。RC2的正确实现
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var sw = new Stopwatch();
sw.Start();
context.Response.OnStarting((state) =>
{
sw.Stop();
context.Response.Headers.Add("x-elapsed-time", sw.ElapsedTicks.ToString());
return Task.FromResult(0);
}, null);
await _next.Invoke(context);
}
}
在调用“下一步”后不要编辑响应标题,如果响应正文未缓冲且已开始发送,它将抛出。啊,谢谢你,@Tratcher!今天上午晚些时候,我将尝试你的建议:)我正在研究同一个问题,并对这是2016年的结果感到惊讶。。。这似乎是我在DAPR中遇到的一个问题的解决方案,它提供的响应格式。。。我应该在.NETCore>=3.1中查看其他内容吗?这对我不适用;回调已经完成,但在管道中还不够晚,而且我的头文件又丢失了。还不够晚吗?这是发送标头之前激发的最后一个事件。要在以后运行,您唯一可以做的就是在管道的最开始处注册中间件(按注册的相反顺序启动)。你到底在添加什么标题?为什么另一个组件正在移除它?