Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在ASP.NET 5中拦截所有其他中间件之后的响应?_Asp.net Core - Fatal编程技术网

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中查看其他内容吗?这对我不适用;回调已经完成,但在管道中还不够晚,而且我的头文件又丢失了。还不够晚吗?这是发送标头之前激发的最后一个事件。要在以后运行,您唯一可以做的就是在管道的最开始处注册中间件(按注册的相反顺序启动)。你到底在添加什么标题?为什么另一个组件正在移除它?