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のカスタマイズを維持したいと思います。
http://stackoverflow.com/questions/13013973/asp-net-web-api-default-error-messages – Timeless