.NET Core MVC获取与日志中间件匹配的路由

时间:2018-07-03 22:29:49

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

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

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

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

这是我到目前为止所拥有的:

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

    await next();
}

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

这是我将其获取到日志记录中间件的方式:

BaseController:

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

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

    await next();
}

LoggingMiddleware:

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

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

有更好的方法吗? 同样,这仅在使用属性路由时有效。如果您要在启动时注册路由,怎么办?

1 个答案:

答案 0 :(得分:3)

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

路由是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。