在ASP .Net Core中的ExceptionFilterAttribute中添加响应头

时间:2017-07-08 13:10:54

标签: c# asp.net-core http-headers middleware action-filter

我正在尝试在发生异常时为.Net核心Web API的响应添加标头。

我正在使用ExceptionFilterAttribute ...

public class ExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        context.HttpContext.Response.Headers.Add("CorrelationId", "12345");
        base.OnException(context);
    }
}

由于某种原因,标题不会发送到客户端。我猜这与已经形成的响应有关,所以它们无法改变?

我有一个自定义中间件,它会在请求上下文中添加一个相关ID,然后将其输出到响应头中。当发生异常时,这不会触发,因此我需要另一种方法来尝试使用过滤器。

我应该改变什么才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

显式设置context.Result以写入异常过滤器的输出:

public override void OnException(ExceptionContext context)
{
    context.HttpContext.Response.Headers.Add("CorrelationId", new string[] { "12345" });

    context.Result = new ObjectResult(null) { StatusCode = 500 };
    context.ExceptionHandled = true;

    base.OnException(context);
}

这会将标题添加到实际响应中。

答案 1 :(得分:1)

尝试一下,

  public class ExceptionFilter : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            var correlationId = "12345";

            // DO OTHER STUFF

            context.HttpContext.Response.OnStarting(() =>
            {
                context.HttpContext.Response.Headers.Add("CorrelationId", correlationId);
                return Task.CompletedTask;
            });
        }
    }