我有一个中间件,每次对我的 API 发出请求时都会调用该中间件。我想记录路由模板以及来自该中间件的请求的持续时间。如何在我的中间件代码中获取路由模板?路由模板类似于“/products/{productId}”。
从自定义中间件获取路由数据并不容易,因为它是由 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
其他替代方法是使用操作过滤器进行请求/响应日志记录。
| 归档时间: |
|
| 查看次数: |
4521 次 |
| 最近记录: |