【问题标题】:.net core 2.2 get action and controller name in logging middleware without ControllerContext.net core 2.2在没有ControllerContext的日志中间件中获取动作和控制器名称
【发布时间】:2021-06-07 10:33:12
【问题描述】:

我正在.net core 2.2 中编写一个中间件。我想在中间件中获取动作名称和控制器名称。
我不能使用ControllerContext,因为它当时不可用。
这是核心 3.1 中的解决方案 Read Controller and Action name in middleware .Net Core

    public async Task Invoke(HttpContext context)
    {
        await LogRequest(context);
        await LogResponse(context);
    }

    private async Task LogResponse(HttpContext context)
    {
          ServiceName = context ...
    }

【问题讨论】:

  • HTTPContext 是 HTML 标记的文本数据。您必须解析 HTML 以获取标签名称。标签名称可能与控制器名称不匹配。
  • 你的目的是什么?您真的需要 pre-route 获取控制器和操作信息吗?我的意思是,如果您将代码 放在 await next .. 之后,您可能有更好的机会获得此类信息,尤其是与过滤器结合使用时。尝试在到达 MVC 中间件之前获取此类信息非常困难,MVC 中间件中有很多逻辑,您几乎需要相同的逻辑来获取所需的信息。对于非属性路由,比较容易,但是对于属性路由,就很复杂了。
  • @KingKing 在互联网上搜索后,我知道对于控制器/动作相关的登录,最好使用动作过滤器。我有一个经典的 asp.net 过滤器,我使用它进行了修改,它借助了块读取和可回收内存的使用。

标签: c# asp.net-core asp.net-core-2.2


【解决方案1】:

当您使用.net core 2.2时,您只能获取路径并从中获取控制器名称和动作名称:

var RouteData = context.Request.Path.Value.Split("/");
var controllerName=RouteData[1];
var ActionName=RouteData[2];

如果你有区域,你需要使用:

var RouteData = context.Request.Path.Value.Split("/");
    var controllerName=RouteData[2];
    var ActionName=RouteData[3];

.net core 3.0以后可以使用HttpRequest.RouteValues:

string actionName = context.Request.RouteValues["action"].ToString();
string controllerName = context.Request.RouteValues["controller"].ToString();

【讨论】:

  • 谢谢,我知道这种方法,但如果 URL 是统一的,那么您可以这样说。表示 Request.Path 是否类似于 stuent/studentinfo/studentname/10
猜你喜欢
  • 2020-01-04
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
相关资源
最近更新 更多