そうです、Application_ErrorまたはExceptionFilterのいずれによってもトラップされない例外のクラスがいくつかあります。Web APIリクエストパイプラインは、ASP.NET MVCパイプラインとは別に(少なくともMVC 4を介して)処理されるため、MVCApplication_Errorは開始されません。また、アプリケーションがHttpResponseException
型例外をスローした場合、それらは設計上キャッチされません(段落を参照)。コードによってスローされたすべての例外にアクセスするには、次のコードの行に沿ってaを作成する必要があります。ExceptionFilter
ExceptionFilter
DelegatingHandler
public class ResponseExceptionTrapper : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
return base
.SendAsync(request, cancellationToken)
.ContinueWith(response =>
{
var result = response.Result;
if (!result.IsSuccessStatusCode)
{
var exceptionResult = string.Format(
"Response exception: Path({0}) Status({1}) ",
request.RequestUri,
result.StatusCode);
if (result.Content != null)
{
var exceptionReadTask =
result.Content.ReadAsStringAsync();
exceptionReadTask.Wait();
exceptionResult += "Message:\n\r" +
exceptionReadTask.Result;
}
// Do something appropriate with exceptionResult
}
return result;
}, cancellationToken);
}
}
グローバル構成ロジックで、ハンドラーを次の行に接続できます。
GlobalConfiguration.Configuration.MessageHandlers.Add(
new ResponseExceptionTrapper());