0

ASP.NET Core Web APIプロジェクトでルーティングエラーをキャッチしようとしています。私は持っているコントローラで :ASP.NET Core Web API:ルーティングエラーをキャッチする

エラーをルーティングすることによって、具体的には、私は、例えば平均

// GET api/values/5 
[HttpGet("{id}")] 
public string Get(int id) 
{ 
    return "value"; 
} 

しかし、要求がある:

api/values/5/6 

404が自動的に返され、私はコードでこれを処理できるようにしたいと考えています(つまり、何らかの例外処理ルーチンを呼び出す)。

私は成功せずに3つの異なるアプローチしようとしている:ConfigureServices(IServiceCollectionサービス)で

を、私が追加:

services.AddMvc(config => 
{ 
    config.Filters.Add(typeof(CustomExceptionFilter)); 
}); 

を私は投げを置く場合、これはコントローラ内で発生するエラー(例えばを取り込み( )を上記のGet(id)メソッドで使用します)。ただし、ルーティングエラーは発生しません。これは、エラーがミドルウェアのパイプラインを伝播するように、一致するコントローラメソッドが見つからなかったためです。さらに、私が試したパイプラインアップエラーを処理しようとする試みで

...

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    app.UseExceptionHandler(
     options => 
     { 
      options.Run(
      async context => 
      { 
       var ex = context.Features.Get<IExceptionHandlerFeature>(); 
       // handle exception here 
      }); 
     }); 

    app.UseApplicationInsightsRequestTelemetry(); 
    app.UseApplicationInsightsExceptionTelemetry(); 
    app.UseMvc(); 
} 

私も試してみました:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    app.Use(async (ctx, next) => 
     { 
      try 
      { 
       await next(); 
      } 
      catch (Exception ex) 
      { 
       // handle exception here 
      } 
     }); 

    app.UseApplicationInsightsRequestTelemetry(); 
    app.UseApplicationInsightsExceptionTelemetry(); 
    app.UseMvc(); 
} 

どちらも上記のは、ルーティングエラーが発生したときに呼び出されるように見えます。私は間違ったアプローチをしていますか?あるいは、これらのアプローチの1つが実際に機能するかどうか?

本当にありがとうございます。

おかげ

クリス

PS。私はASP.NET Web APIには比較的新しいので、間違った言葉を少し使っているかもしれません。

答えて

3

あなたはUseStatusCodePages拡張メソッドを使用することができます

app.UseStatusCodePages(new StatusCodePagesOptions() 
{ 
    HandleAsync = (ctx) => 
    { 
      if (ctx.HttpContext.Response.StatusCode == 404) 
      { 
       //handle 
      } 

      return Task.FromResult(0); 
    } 
}); 

編集

app.UseExceptionHandler(options => 
{ 
     options.Run(async context => 
     { 
      var ex = context.Features.Get<IExceptionHandlerFeature>(); 
      // handle 
      await Task.FromResult(0); 
     }); 
}); 
app.UseStatusCodePages(new StatusCodePagesOptions() 
{ 
    HandleAsync = (ctx) => 
    { 
      if (ctx.HttpContext.Response.StatusCode == 404) 
      { 
       // throw new YourException("<message>"); 
      } 

      return Task.FromResult(0); 
    } 
}); 
+0

おかげで、私は、可能な場合に例外を捕捉することを好むだろう - これは可能ですか?ここでのアプローチは、問題が発生したときに例外をキャプチャするのではなく、イベント後の結果をキャプチャするような感じです。 – cbailiss

+0

なぜ404結果の例外が必要ですか? –

+0

例外を使用したい場合でも、私の更新を参照してください。 –

関連する問題