WebApi 메시지 핸들러에서 예외를 반환하는 방법 \ WebApi 응용 프로그램 등록정상적으로 내 MVC에서 글로벌 ExceptionFilter이
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);
}
}
이 필터는 모든 예외를 반환 json-objects로 사용하고 일부 IMyExceptionHandler-implementation은 반환되는 객체를 사용자 정의 할 수 있습니다.
이 모든 것이 잘 작동합니다. 내 메시지 핸들러에서 예외를 설정해야까지 :
이 핸들러를 볼 수 있듯이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);
}
}
몇 가지 구성 요소를 만들고 현재 HTTP 요청 메시지에 넣어. FuncOfIBar에서 예외가 발생하면 죽음의 황색 화면이 나타납니다. 내 ExceptionFilter가 호출되지 않습니다.
은 내가 특별히 메시지 처리기에서 예외를 잡아 HttpResponseException를 반환하는 시도했지만 아무것도 변경되지 않습니다 - 여전히 점점 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);
}
}
}
내가 할 내 응용 프로그램의 동작을 원하지을 ApiController 또는 메시지 핸들러에서 예외가 발생하는 위치와 관계없이 동일합니다.
어떻게 수행하나요?
나는 Application_Error에 대해 알고 있지만 HttpApplication 사용자 지정을 건드리지 않고 유지하려고합니다. 대신 난 그냥 반환해야 HttpResponseException
을 던지는
http://stackoverflow.com/questions/13013973/asp-net-web-api-default-error-messages – Timeless