首页 新闻 会员 周边 捐助

ASP.NET Core 3.0 中间件中如何知道当前请求路径会被哪个 Controller 处理

0
悬赏园豆:50 [已解决问题] 解决于 2019-07-17 17:07

请问在ASP.NET Core 3.0 中间件(middleware)中如何知道当前请求路径会被哪个 Controller 处理?

dudu的主页 dudu | 高人七级 | 园豆:30778
提问于:2019-07-16 22:29
< >
分享
最佳答案
1

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);
    }
}
dudu | 高人七级 |园豆:30778 | 2019-07-17 17:02

访问一个 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 | 园豆:30778 (高人七级) | 2019-07-17 17:07

@dudu:

du神
我研究了下
获取Endpoint 只能在 await next(); 之后 也就是 action执行之后
有什么版本能在 action 执行之前就等到 我这个终结点的一些 元数据吗
我现在有一个需求是在 action执行之前 想在中间件里做

Skolley | 园豆:136 (初学一级) | 2019-11-09 20:13

@Skolley: 上面的代码不就是在 await _next(context); 之前吗?

dudu | 园豆:30778 (高人七级) | 2019-11-09 20:24

@dudu: 我这里本地代码 跑了下 在 await _next(context) 之前拿到的 Endpoint 是空
我放在了第一个中间件

Skolley | 园豆:136 (初学一级) | 2019-11-09 20:30

@dudu: 我执行完 next 回来的时候 终结点就能拿到了

Skolley | 园豆:136 (初学一级) | 2019-11-09 20:31

@Skolley: 这个我觉得应该是 还没走到 内部初始化 终结点的地方 所有得不到 我之前的一个需求是记日志 所以在 next 之后可以没问题

Skolley | 园豆:136 (初学一级) | 2019-11-09 20:36

@dudu: 放到 app.UseRouting();之后就可以得到了 肯定是那个中间件采取初始化终结点 差点去翻源码了 哈哈

放到 app.UseEndpoints 之后

Skolley | 园豆:136 (初学一级) | 2019-11-09 20:41
其他回答(1)
0

向老大学习

Q.L.P | 园豆:229 (菜鸟二级) | 2019-07-18 08:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册