首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与日志中间件匹配的.NET核心MVC get路由

与日志中间件匹配的.NET核心MVC get路由
EN

Stack Overflow用户
提问于 2018-07-04 06:29:49
回答 1查看 871关注 0票数 0

在我的项目中,我使用日志中间件记录每个请求。出于日志记录的目的,我如何获取与请求匹配的路由?

我在请求中有完整路径,例如/v1/User/123

但是我想记录下来: /v1/User/{id}

这是我到目前为止所知道的:

代码语言:javascript
运行
复制
public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    var path = context.ActionDescriptor.AttributeRouteInfo.Template;

    await next();
}

这是在我的基本控制器中,我如何将它放到日志中间件中?

下面是我如何将其添加到日志中间件中:

BaseController:

代码语言:javascript
运行
复制
public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    var actionPath = context.ActionDescriptor.AttributeRouteInfo.Template;

    HttpContext.Items.Add("ActionInfo", actionPath);

    await next();
}

LoggingMiddleware:

代码语言:javascript
运行
复制
var actionInfo = context.Items["ActionInfo"];

if (actionInfo != null)
{
    actionMatched = actionInfo.ToString();
}

有没有更好的方法来做这件事?此外,这仅适用于使用属性路由的情况。如果您在启动时注册路由,这如何工作?

EN

回答 1

Stack Overflow用户

发布于 2018-07-04 07:56:33

嗯,简单明了,你做不到。

路由是一个MVC概念,因此它的存在只能在ASP.NET核心的ASP.NET中间件中找到。这就是为什么你可以从ActionFilter访问它,这也是ASP.NET核心MVC的概念。从一个中间件中,您能得到的最接近的方法是通过使用Path/Query/QueryString/Method.访问httpContext.Request

了解了这一点,你就有了这样的选择:

  1. 将记录器实现为操作筛选器。这使您可以轻松地访问路由和其他详细信息,如控制器和操作方法。但是,在MVC中间件之外处理的请求(静态文件,授权失败,命名)将不会将其作为中间件logged.
  2. Implement并简单地记录URL。
  3. 以某种方式将数据存储在某个地方,以便您的中间件可以访问它,就像您通过向HttpContext添加项所做的那样。这感觉很奇怪。

选项1和选项2都是很好的选择,它取决于您的需求,这是最适合您的。也许1和2都有可能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51163565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档