之前对这个问题的回答没有解决如果控制器操作引发异常应该怎么做。有两种基本方法可以解决这个问题:
添加异常过滤器:
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
public class HeaderAdderExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Response == null)
context.Response = context.Request.CreateErrorResponse(
HttpStatusCode.InternalServerError, context.Exception);
context.Response.Content.Headers.Add("header", "value");
}
}
在您的WebApi设置中:
configuration.Filters.Add(new HeaderAdderExceptionFilter())
这种方法有效是因为WebApi的默认异常处理程序将发送在过滤器中创建的HttpResponseMessage,而不是构建自己的HttpResponseMessage。
替换默认异常处理程序:
using System.Net;
using System.Net.Http;
using System.Web.Http.ExceptionHandling;
using System.Web.Http.Results;
public class HeaderAdderExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
HttpResponseMessage response = context.Request.CreateErrorResponse(
HttpStatusCode.InternalServerError, context.Exception);
response.Headers.Add("header", "value");
context.Result = new ResponseMessageResult(response);
}
}
在您的WebApi设置中:
configuration.Services.Replace(typeof(IExceptionHandler), new HeaderAdderExceptionHandler());
您不能同时使用这两个功能。好吧,您可以这样做,但是处理程序将永远不会执行任何操作,因为过滤器已经将异常转换为响应。
非常重要的是注意,按照现有代码,此代码将向客户端发送所有异常细节。在生产环境中,您可能不希望这样做,请查看CreateErrorResponse()上的所有可用重载,并选择适合您需要的重载。
null
,你应该改为使用actionExecutedContext.Response.Headers.Add
。 - George