ASP.Net core-从中间件获取routetemplate值

sat*_*hya 5 asp.net-core

我有一个中间件,每次对我的 API 发出请求时都会调用该中间件。我想记录路由模板以及来自该中间件的请求的持续时间。如何在我的中间件代码中获取路由模板?路由模板类似于“/products/{productId}”。

Pra*_*mar 2

从自定义中间件获取路由数据并不容易,因为它是由 MVC 中间件创建的,而 MVC 中间件通常恰好是 ASP.NET Core 管道中最后执行的中间件。

如果您想在中间件中记录请求和响应,如下所示,

public async Task Invoke(HttpContext context)
    {
        var requestBodyStream = new MemoryStream();
        var originalRequestBody = context.Request.Body;

        await context.Request.Body.CopyToAsync(requestBodyStream);
        requestBodyStream.Seek(0, SeekOrigin.Begin);

        var url = UriHelper.GetDisplayUrl(context.Request);
        var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd();
        _logger.Log(LogLevel.Information, 1, $"REQUEST METHOD: {context.Request.Method}, REQUEST BODY: {requestBodyText}, REQUEST URL: {url}", null, _defaultFormatter);

        requestBodyStream.Seek(0, SeekOrigin.Begin);
        context.Request.Body = requestBodyStream;

        await next(context);
                var bodyStream = context.Response.Body;

    var responseBodyStream = new MemoryStream();
    context.Response.Body = responseBodyStream;

    await _next(context);

    responseBodyStream.Seek(0, SeekOrigin.Begin);
    var responseBody = new StreamReader(responseBodyStream).ReadToEnd();
    _logger.Log(LogLevel.Information, 1, $"RESPONSE LOG: {responseBody}", null, _defaultFormatter);
    responseBodyStream.Seek(0, SeekOrigin.Begin);
    await responseBodyStream.CopyToAsync(bodyStream);
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果您真的对路线数据感兴趣,这里有一个非常好的答案来实现获取路线miidleware

其他替代方法是使用操作过滤器进行请求/响应日志记录。