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

Asp.net mvc .NET Core MVC获取日志中间件的匹配路由,asp.net-mvc,asp.net-core-mvc,asp.net-core-2.1,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.ActionDe

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

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

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

以下是我到目前为止的情况:

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

    await next();
}
这是在我的基本控制器中,如何将其发送到日志中间件

下面是我如何将其发送到日志中间件的:

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

if (actionInfo != null)
{
    actionMatched = actionInfo.ToString();
}
基本控制器:

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核心的MVC中间件中找到。这就是为什么您可以从ActionFilter访问它,这也是ASP.NET核心MVC概念。从一个中间件中,您可以通过转到
httpContext.Request
并使用
Path
/
Query
/
QueryString
/
方法获得最接近的结果

了解这一点后,您可以选择:

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

  • 选项1和2都是不错的选择,这取决于你的需要,哪一个最适合你。也许连1和2都有。

    好吧,简单明了,你不能

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

    了解这一点后,您可以选择:

  • 将记录器实现为动作过滤器。这允许您轻松访问路线和其他详细信息,如控制器和操作方法。但是,在MVC中间件之外处理的请求(静态文件、授权失败、命名)将不会被记录
  • 将其作为中间件实现,只需记录URL即可
  • 将数据以某种方式存储在某个地方,以便中间件可以访问它,就像您通过向
    HttpContext
    添加项所做的那样。这感觉很不舒服
  • 选项1和2都是不错的选择,这取决于你的需要,哪一个最适合你。甚至可能是1和2