【问题标题】:.NET Core MVC get route matched for logging middleware.NET Core MVC 获取匹配日志中间件的路由
【发布时间】:2018-07-03 22:29:48
【问题描述】:

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

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

但我想记录这个:/v1/User/{id}

这是我目前所拥有的:

public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    var path = context.ActionDescriptor.AttributeRouteInfo.Template;

    await next();
}

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

这是我如何将它发送到日志中间件的:

基础控制器:

public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    var actionPath = context.ActionDescriptor.AttributeRouteInfo.Template;

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

    await next();
}

日志中间件:

var actionInfo = context.Items["ActionInfo"];

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

有没有更好的方法来做到这一点? 此外,这仅在您使用属性路由时才有效。如果您在启动时注册路由,这将如何工作?

【问题讨论】:

    标签: asp.net-mvc asp.net-core-mvc asp.net-core-2.1


    【解决方案1】:

    嗯,简单明了,你不能。

    路由是一个 ASP.NET Core MVC 概念,因此它的存在只能在 ASP.NET Core 的 MVC 中间件中找到。这就是您可以从 ActionFilter 访问它的原因,这也是一个 ASP.NET Core MVC 概念。从一个中间件中,您可以获得最接近的方法是转到httpContext.Request 并使用Path/Query/QueryString/Method

    知道了这一点,你就有了选择:

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

    选项 1 和 2 都是不错的选择,这取决于您的需求,哪个最适合您。甚至可能是 1 和 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2020-11-27
      • 2012-07-13
      • 1970-01-01
      相关资源
      最近更新 更多