在中间件.Net Core中读取Controller和Action名称

时间:2017-08-28 14:01:56

标签: c# asp.net-core middleware

我正在我的项目中编写一个中间件类,以便将请求数据记录到我们的数据库中。

我没有看到任何简单的方法来获取控制器名称和操作? 有没有机会在核心轻松做到这一点?

我有这样的事情:

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
    }       
}

4 个答案:

答案 0 :(得分:13)

我遇到了同样的问题,这在.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);
}

为了使GetEndpoint()返回null的实际端点instad,必须满足以下条件。

  • 启用端点路由(用AddControllers()代替AddMvc()
  • UseRouting()UseEndpoints()之间调用中间件。

答案 1 :(得分:6)

在.NET Core 2.0中,您可以在Filter:

中执行此操作
public class AuthorizationFilter : IAsyncAuthorizationFilter
    {
        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
            string controllerName = controllerActionDescriptor?.ControllerName;
            string actionName = controllerActionDescriptor?.ActionName;
        }
    }

答案 2 :(得分:2)

要添加Ganesh的答案,我想添加一些条件。

  • 启用端点路由(用AddControllers()代替AddMvc()
  • UseRouting()UseEndpoints()之间调用中间件。

否则GetEndpoint()返回null。

答案 3 :(得分:1)

控制器和操作数据可通过过滤器获得,因此我以这种方式实现了它。控制器和操作数据在ActionExecutingContext对象中可用。

public class AsyncActionFilter : IAsyncActionFilter
{
     public AsyncActionFilter(IEntityContext entityContext)
     {
         _entityContext = entityContext;
     }

     public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
     {  
          //Handle the request
          await next();
     }
}