1

Asp.net WebApi(RC)を使用して、例外フィルターまたはglobal.asaxでキャッチされないエラーをキャッチするにはどうすればApplication_Error()よいですか?

これらの両方が整っているので、まだカバーされていない例外のクラスがあるようです。例:ApiControllerActionSelector_AmbiguousMatchエラー(Multiple actions were found that match the request: {0})。

上記のエラーについては特に心配していませんApplication_Error。このエラーは、例外フィルターまたはメソッド のいずれにもキャッチされていないクラスのエラーがあることを示しています。

では、どうすればすべての拠点をカバーできますか?

4

2 に答える 2

3

そうです、Application_ErrorまたはExceptionFilterのいずれによってもトラップされない例外のクラスがいくつかあります。Web APIリクエストパイプラインは、ASP.NET MVCパイプラインとは別に(少なくともMVC 4を介して)処理されるため、MVCApplication_Errorは開始されません。また、アプリケーションがHttpResponseException型例外をスローした場合、それらは設計上キャッチされません(段落を参照)。コードによってスローされたすべての例外にアクセスするは、次のコードの行に沿ってaを作成する必要があります。ExceptionFilter ExceptionFilterDelegatingHandler

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());
于 2012-08-14T13:37:53.657 に答える
2

例外フィルターは、アクションが呼び出されたときにのみ呼び出されると思います(この場合、その周りにtry / catchがあります)。あいまいな一致エラーは、パイプラインでその前にポップアップし、その後にポップアップする他のエラー(たとえば、フォーマッターエラー)が発生する可能性があります。

すべての側面に対処するための1つのソリューションがあるかどうかはわかりませんが(ホスティングの実装は異なる可能性があるため)、をオーバーライドしてみることができますHttpControllerDispatcher。このクラスは、パイプラインで使用される「ルート」クラスの1つです。具体的には、オーバーライドSendAsyncしてtry / catchを実行し、それに応じて処理することができます。

于 2012-08-14T10:11:55.420 に答える