получить информацию о типе контроллера в промежуточном программном обеспечении (или как отличить запрос к веб-API и для страницы)

#c# #asp.net-core #asp.net-core-2.2 #asp.net-core-routing

#c# #asp.net-core #asp.net-core-2.2 #asp.net-core-routing

Вопрос:

Я хочу создать промежуточное программное обеспечение, которое обрабатывает исключения, но отдельные запросы к контроллеру api и к страницам razor / mvc. В промежуточном программном обеспечении у меня есть только context.Request.URL-адрес пути и хотите «найти» контроллер (или страницу), которому назначено обрабатывать запрос, затем проанализировать информацию о его типе и принять решение.

Что-то вроде этого:

 MyExceptionHandlerMiddleware{
   public async Task Invoke(HttpContext context)
   {
       try
       {
          await _next(context);
       }
       catch (Exception ex)
       {
           var path = context.Request.Path;
           var isApiCall = ... ???? 
           if ( isApiCall   )
           {
              var json = GetJson(ex);
              wait context.Response.WriteAsync(json); // return json
           } 
           else {
              await _options.ExceptionHandler(context); // return the page
           }
       }
   }
}
  

Проблема в том, что на данный момент кажется, что обычная информация о маршрутизации недоступна. Как получить информацию о типе контроллера?

Как отличить вызовы веб-api и для страницы в контексте промежуточного программного обеспечения?

Комментарии:

1. В ядре как MVC, так и Api наследуются от Controller … к вашему сведению

2. Я мог бы использовать reflection api и проверять атрибуты контроллера (или извлекать из своих собственных контроллеров). Но я также приветствую любое альтернативное решение.

Ответ №1:

Не уверен, почему вы хотите это сделать. Вы можете использовать встроенное UseExceptionHandler() промежуточное программное обеспечение в Asp.Net Ядро и использовать его Path свойство для получения информации о маршруте, вероятно, как

 var path = HttpContext.Features.Get<IExceptionHandlerPathFeature>()?.Path;
  

Комментарии:

1. Спасибо, я проверю, как работает функция. Что такое uclear? Почему я хочу отправить json с дополнительной информацией об ошибке? Вы пробовали использовать UseExceptionHandler() для разделения вызовов api и страниц? Я потерпел неудачу. В любом случае UseExceptionHandler работает в том же контексте, что и пользовательское промежуточное программное обеспечение. Нет никакой разницы, обрабатывает ли пользовательское промежуточное программное обеспечение диагностику ms, но есть полный контроль над кодом.

2. @RomanPokrovskij Нет, я имею в виду, когда уже есть готовый, тогда зачем создавать пользовательский? если вы не делаете что-то дополнительное, что не присутствует

3. Ответ прост — я потерпел неудачу с этим, когда добился успеха с пользовательским промежуточным программным обеспечением (это работает, но различие «маршрутизации» жестко задано — и я хочу этого избежать). Но я дам второй шанс стандартному UseExceptionHandler. Но в контексте вопроса это не важно. UseExceptionHandler или пользовательское промежуточное программное обеспечение — это просто «рамки» для изображения.

4. var path = HttpContext.Features.Get<IExceptionHandlerPathFeature>() не работает в контексте пользовательского промежуточного программного обеспечения. кстати, его значение path просто context.Request.Path не является информацией о contoller (и его типе)

5. Можем ли мы сосредоточиться на реальной проблеме, и кто-нибудь предложит способ найти тип в промежуточном программном обеспечении? Меня не волнуют обработчики исключений, я хочу знать, как сделать эту конкретную вещь