在我的项目中,我正在使用日志记录中间件记录每个请求。如何获取与请求匹配的路由以进行记录?
我在请求中有完整路径,例如/ 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();
}
有更好的方法吗? 同样,这仅在使用属性路由时有效。如果您要在启动时注册路由,怎么办?
答案 0 :(得分:3)
好,简单明了,你做不到。
路由是ASP.NET Core MVC的概念,因此,它的存在只能在ASP.NET Core的MVC中间件中找到。这就是为什么您可以从ActionFilter(也是ASP.NET Core MVC概念)访问它的原因。在某种中间件中,最接近的方法是转到httpContext.Request
,然后使用Path
/ Query
/ QueryString
/ Method
。
知道这一点之后,您将拥有的选择:
HttpContext
中添加项目一样。这感觉很hacky。选项1和2都是不错的选择,它取决于您的需求,最适合您。也许甚至是1和2。