Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取中间件.Net核心中的控制器和操作名称_C#_Asp.net Core_Middleware - Fatal编程技术网

C# 读取中间件.Net核心中的控制器和操作名称

C# 读取中间件.Net核心中的控制器和操作名称,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,我正在我的项目中编写一个中间件类,以便将请求数据记录到我们的数据库中 我看不到任何简单的方法来获取控制器名称和操作? 有没有机会在core轻松做到这一点 我有这样的想法: public class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; public RequestResponseLoggingMiddleware(RequestDelegate next) {

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

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

我有这样的想法:

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()
    之间调用中间件

在Ganesh的回答中,我想补充几个条件

  • 启用端点路由(
    AddControllers()
    而不是
    AddMvc()
  • UseRouting()
    UseEndpoints()
    之间调用中间件

否则,
GetEndpoint()
将返回null。

我知道的可能重复,但可能太旧了?以上所有操作都不适用于.Net Core 1.1.2!这不是问题的答案,而是另一个问题的答案。这里没有中间件,我给了你一票,但是你能编辑Ganesh的答案来包含这个重要的细节吗。我也不明白他们为什么要用try/catch把事情复杂化。如果不是因为你最后一个要点,我的头还会撞到这个!如果你感到烦恼,也许值得强调一下它的重要性,因为这并没有很好的记录,我同意本的观点。第二个要点是救命稻草!!