在我的项目中,我使用日志中间件记录每个请求。出于日志记录的目的,我如何获取与请求匹配的路由?
我在请求中有完整路径,例如/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();
}
有没有更好的方法来做这件事?此外,这仅适用于使用属性路由的情况。如果您在启动时注册路由,这如何工作?
发布于 2018-07-04 07:56:33
嗯,简单明了,你做不到。
路由是一个MVC概念,因此它的存在只能在ASP.NET核心的ASP.NET中间件中找到。这就是为什么你可以从ActionFilter访问它,这也是ASP.NET核心MVC的概念。从一个中间件中,您能得到的最接近的方法是通过使用Path
/Query
/QueryString
/Method
.访问httpContext.Request
了解了这一点,你就有了这样的选择:
HttpContext
添加项所做的那样。这感觉很奇怪。选项1和选项2都是很好的选择,它取决于您的需求,这是最适合您的。也许1和2都有可能。
https://stackoverflow.com/questions/51163565
复制相似问题