0

ASP.NET 핵심 웹 API 프로젝트에서 라우팅 오류를 잡으려고합니다.ASP.NET 핵심 웹 API : 라우팅 오류 잡기

오류를 라우팅하여, 구체적으로, 내가 예를 들어 의미 : 컨트롤러에서 을 나는 단지이 :

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

그러나 요청은 다음과 같습니다

api/values/5/6 

404은 자동으로 반환됩니다, 하지만 코드 (즉, 일종의 예외 처리 루틴을 호출 할)이 처리 할 수 ​​싶습니다.

내가 성공하지 않고 세 가지 다른 접근 시도

: ConfigureServices에서

(IServiceCollection 서비스), I는 추가 :

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(); 
} 

둘은 라우팅 오류가 발생할 때 호출 될 것으로 보인다

. 잘못된 접근 방식을 취하고 있습니까? 또는 이러한 접근법 중 하나가 실제로 작동해야합니까?

모든 제안은 정말 감사하겠습니다.

감사

크리스

PS. 나는 상대적으로 ASP.NET 웹 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

그래도 예외를 사용하려면 내 업데이트를 참조하십시오. –