C# 读取中间件.Net核心中的控制器和操作名称
我正在我的项目中编写一个中间件类,以便将请求数据记录到我们的数据库中 我看不到任何简单的方法来获取控制器名称和操作? 有没有机会在core轻松做到这一点 我有这样的想法:C# 读取中间件.Net核心中的控制器和操作名称,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,我正在我的项目中编写一个中间件类,以便将请求数据记录到我们的数据库中 我看不到任何简单的方法来获取控制器名称和操作? 有没有机会在core轻松做到这一点 我有这样的想法: public class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; public RequestResponseLoggingMiddleware(RequestDelegate next) {
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestResponseLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
//handle the request
//something like: context.GetRouteData();
await _next(context);
//handle the response
}
}
控制器和动作数据可以通过过滤器获得,所以我用这种方式实现了它。控制器和动作数据在ActionExecutingContext对象中可用
public class AsyncActionFilter : IAsyncActionFilter
{
public AsyncActionFilter(IEntityContext entityContext)
{
_entityContext = entityContext;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//Handle the request
await next();
}
}
在.NET Core 2.0中,您可以在筛选器中执行此操作:
public class AuthorizationFilter : IAsyncAuthorizationFilter
{
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
string controllerName = controllerActionDescriptor?.ControllerName;
string actionName = controllerActionDescriptor?.ActionName;
}
}
我也有同样的问题,这在.NetCore 3.1中对我有效:
public async Task InvokeAsync(HttpContext httpContext)
{
var controllerActionDescriptor = httpContext
.GetEndpoint()
.Metadata
.GetMetadata<ControllerActionDescriptor>();
var controllerName = controllerActionDescriptor.ControllerName;
var actionName = controllerActionDescriptor.ActionName;
await _next(httpContext);
}
public异步任务InvokeAsync(HttpContext-HttpContext)
{
var controllerActionDescriptor=httpContext
.GetEndpoint()
.元数据
.GetMetadata();
var controllerName=controllerActionDescriptor.controllerName;
var actionName=controllerActionDescriptor.actionName;
等待下一步(httpContext);
}
要使GetEndpoint()
返回null的实际端点instad,必须满足以下条件
- 启用端点路由(
而不是AddControllers()
)AddMvc()
- 在
和UseRouting()
之间调用中间件UseEndpoints()
- 启用端点路由(
而不是AddControllers()
)AddMvc()
- 在
和UseRouting()
之间调用中间件UseEndpoints()
否则,
GetEndpoint()
将返回null。我知道的可能重复,但可能太旧了?以上所有操作都不适用于.Net Core 1.1.2!这不是问题的答案,而是另一个问题的答案。这里没有中间件,我给了你一票,但是你能编辑Ganesh的答案来包含这个重要的细节吗。我也不明白他们为什么要用try/catch把事情复杂化。如果不是因为你最后一个要点,我的头还会撞到这个!如果你感到烦恼,也许值得强调一下它的重要性,因为这并没有很好的记录,我同意本的观点。第二个要点是救命稻草!!