.net core 2.2 在没有 ControllerContext 的日志记录中间件中获取操作和控制器名称

问题描述

我正在 .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 ...
    }

解决方法

由于您使用的是 .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();