首页 > 解决方案 > 在中间件中获取控制器的类型信息(或如何区分对 Web api 和页面的请求)

问题描述

我想创建处理异常但对 api 控制器和剃须刀页面/mvc 的不同请求的中间件。在中间件中,我只有一个 context.Request.Path 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
           }
       }
   }
}

问题是,此时似乎常规路由信息不可用。如何获取控制器的类型信息?

如何区分对 web api 的调用和中间件上下文中的页面?

标签: c#asp.net-coreasp.net-core-2.2asp.net-core-routing

解决方案


不知道你为什么要这样做。UseExceptionHandler()您可以使用Asp.Net Core 中的内置中间件并使用它的Path属性来获取路由信息,可能就像

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

推荐阅读