我想创建中间件来处理异常但是对api控制器和razor pages / 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和页面的调用?
不知道你为什么要这样做。您可以使用Asp.Net Core中内置的UseExceptionHandler()
中间件并使用它的Path
属性来获取路径信息
var path = HttpContext.Features.Get<IExceptionHandlerPathFeature>()?.Path;