Tengo un ExceptionFilter mundial en mi MVC \ WebAPI aplicación registrada como:Cómo devolver gracia excepción de un Handler WebAPI mensaje
public virtual void RegisterHttpFilters(HttpConfiguration config)
{
config.Filters.Add(new MyExceptionFilter(_exceptionHandler));
}
donde MyExceptionFilter es:
public class MyExceptionFilter : ExceptionFilterAttribute
{
private readonly IMyExceptionHandler m_exceptionHandler;
public MyExceptionFilter(IMyExceptionHandler exceptionHandler)
{
m_exceptionHandler = exceptionHandler;
}
public override void OnException(HttpActionExecutedContext context)
{
Exception ex = context.Exception;
if (ex != null)
{
object response = null;
HttpStatusCode statusCode = m_exceptionHandler != null
? m_exceptionHandler.HandleException(ex, out response)
: HttpStatusCode.InternalServerError;
context.Response = context.Request.CreateResponse(statusCode, response ?? ex);
}
base.OnException(context);
}
}
Este filtro devuelve todas las excepciones como json-objects y permite que alguna IMyExceptionHandler-implementation personalice el objeto que se devuelve.
Todo esto funciona bien. Hasta que tengo una excepción en algunos de mis controladores de mensajes:
public class FooMessageHandler : DelegatingHandler
{
private readonly Func<IBar> _barFactory;
public FooMessageHandler(Func<IBar> barFactory)
{
_barFactory = varFactory;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Properties["MY_BAR"] = _barFactory();
return base.SendAsync(request, cancellationToken);
}
}
Como se puede ver este controlador crea un cierto componente y ponerlo en el mensaje de solicitud HTTP actual. Cuando ocurre una excepción en FuncOfIBar, obtengo la pantalla amarilla de la muerte. Mi ExceptionFilter no es llamado.
Traté de coger específicamente la excepción en el controlador de mensajes y volver HttpResponseException pero no cambia nada - que todavía consigue YSOD:
public class XApplicationInitializerMessageHandler : DelegatingHandler
{
private readonly Func<IXCoreApplication> _appFactory;
private readonly IXExceptionHandler m_exceptionHandler;
public XApplicationInitializerMessageHandler(Func<IXCoreApplication> appFactory, IXExceptionHandler exceptionHandler)
{
ArgumentValidator.EnsureArgumentNotNull(appFactory, "appFactory");
_appFactory = appFactory;
m_exceptionHandler = exceptionHandler;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
try
{
request.SetApplication(_appFactory());
}
catch (Exception ex)
{
object resultObject = null;
HttpStatusCode statusCode = m_exceptionHandler != null
? m_exceptionHandler.HandleException(ex, out resultObject)
: HttpStatusCode.InternalServerError;
HttpResponseMessage responseMessage = request.CreateResponse(statusCode, resultObject ?? ex);
throw new HttpResponseException(responseMessage);
}
return base.SendAsync(request, cancellationToken);
}
}
}
Quiero comportamiento de mi aplicación para ser igual independientemente de dónde ocurre una excepción: en un ApiController o un manejador de mensajes.
¿Cómo hacer esto?
Conozco Application_Error pero me gustaría mantener la personalización de HttpApplication intocable.
http://stackoverflow.com/questions/13013973/asp-net-web-api-default-error-messages – Timeless