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 возвращается автоматически, но я хотел бы иметь возможность обрабатывать это в коде (т. е. вызывать какую-то процедуру обработки исключений).

Я попытался три различных подхода без успеха:

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

Ни то, ни по-видимому, вызывается при возникновении ошибки маршрутизации , Я принимаю неправильный подход? Или должен ли работать один из этих подходов?

Любые предложения были бы очень оценены.

Благодаря

Chris

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

Даже если вы хотите использовать исключение, см. Мое обновление. –

Смежные вопросы