请问在ASP.NET Core 3.0 中间件(middleware)中如何知道当前请求路径会被哪个 Controller 处理?
Endpoint routing 再次闪亮登场(上次登场),通过 endpoint routing 读取 ControllerActionDescriptor meta data 搞定
public class CnblogsQ116803Middleware
{
private readonly RequestDelegate _next;
public CnblogsQ116803Middleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint != null)
{
var controllerName = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>()?.ControllerName;
Console.WriteLine(controllerName);
}
await _next(context);
}
}
访问一个 mvc controller action 时默认有以下 meta data
Microsoft.AspNetCore.Mvc.ControllerAttribute
Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor
Microsoft.AspNetCore.Routing.DataTokensMetadata
Microsoft.AspNetCore.Routing.RouteNameMetadata
Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter
Microsoft.AspNetCore.Mvc.ViewFeatures.SaveTempDataAttribute
Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter
Microsoft.AspNetCore.Routing.SuppressLinkGenerationMetadata
@dudu:
du神
我研究了下
获取Endpoint 只能在 await next(); 之后 也就是 action执行之后
有什么版本能在 action 执行之前就等到 我这个终结点的一些 元数据吗
我现在有一个需求是在 action执行之前 想在中间件里做
@Skolley: 上面的代码不就是在 await _next(context);
之前吗?
@dudu: 我这里本地代码 跑了下 在 await _next(context) 之前拿到的 Endpoint 是空
我放在了第一个中间件
@dudu: 我执行完 next 回来的时候 终结点就能拿到了
@Skolley: 这个我觉得应该是 还没走到 内部初始化 终结点的地方 所有得不到 我之前的一个需求是记日志 所以在 next 之后可以没问题
@dudu: 放到 app.UseRouting();之后就可以得到了 肯定是那个中间件采取初始化终结点 差点去翻源码了 哈哈
放到 app.UseEndpoints 之后
向老大学习