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