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);
}
}
从这个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);
}
}