ASP.当动作过滤器创建响应时,未调用.NET Web API异常过滤器

本文关键字:过滤器 NET 调用 Web 异常 API 创建 响应 ASP | 更新日期: 2023-09-27 18:04:53

使用Web API,我有一个异常过滤器,它应该使用来自某些异常的数据编写自定义有效负载。

但是,我还使用了一个动作过滤器,它应该向响应消息添加一些HTTP头。当没有抛出异常时,这可以正常工作。

当抛出异常时,我的动作过滤器被给予NULL响应(httpactionperformed .Response),因此不能添加其头。我试图通过创建一个新的ResponseMessage来解决这个问题,然后再添加报头,如果响应是NULL。但是当我在动作过滤器中创建一个新的ResponseMessage时,我的异常过滤器将不再被调用。

我猜Web API模型以某种方式计算,如果存在响应消息,则不会抛出异常。任何想法,我如何使用一个异常过滤器,而仍然有一个动作过滤器添加HTTP头?

我的异常过滤器:

public class ExceptionStatusFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (!(context.Exception is CertainException))
        {
            return;
        }
        var exception = context.Exception as CertainException;
        var error = new DefaultErrorContainer
        {
            Error = new Error
            {
                Description = exception.Message,
                ErrorCode = exception.ErrorCode,
                ErrorThirdParty = exception.ThirdPartyErrorCode
            }
        };
        context.Response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, error);
    }
}

和动作过滤器:

public class ProfilingActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var header = "foo";
        if (context.Response == null)
        {
            context.Response = new HttpResponseMessage();
        }
        context.Response.Headers.Add("X-SOME-HEADER", header);
    }
}

ASP.当动作过滤器创建响应时,未调用.NET Web API异常过滤器

从这个SO链接中,您可以了解Action过滤器被调用的顺序。

异常过滤器是最后被调用的,所以如果你在此过滤器执行之前生成响应或处理异常,你的异常过滤器将假设没有抛出异常,它不会执行。

我的建议是在异常上,创建一个响应并将头单独附加到这个异常响应上。

这个链接也有帮助。

    public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
                // Append Header here.
                context.Response.Headers.Add("X-SOME-HEADER", header);
            }
        }