2017-02-22 175 views
0

越来越routetemplate值我有一个名为的每个请求我的API中间件。我想记录路线模板以及来自这个中间件的请求的持续时间。如何在我的中间件代码中获得路由模板?路线模板类似于“/ products/{productId}”。ASP.Net核心 - 从中​​间件

回答

2

这并不容易,因为它是由MVC中间件通常恰好是在ASP.NET核心管线要执行的最后中间件创建从自定义中间件获得路由数据。

如果你想登录为下方的中间件的请求和响应,

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); 
    } 

但是,如果你是在路由数据真正感兴趣,有非常漂亮的SO回答来实现获取路线miidleware here

其它可供选择的方法是使用为Action Filters请求/响应日志记录。

+0

你的代码示例记录了实际的请求url。我想记录路线模板。而不是/ products/product123我想记录/ products/{productId}。不过,我可以使用动作过滤器来获得此功能。感谢那些信息。 – sathya

0

这是我如何得到它的工作。我在我的过滤器OnActionExecuting方法中获取路由模板并将其添加到HttpContext。后来,我从中间件内部的HttpContext访问它,因为我可以在中间件内部访问HttpContext。

public class LogActionFilter : IActionFilter 
    { 
     public LogActionFilter() 
     { 
     } 
     public void OnActionExecuted(ActionExecutedContext context) 
     { 

     } 

     public void OnActionExecuting(ActionExecutingContext context) 
     { 
      context.HttpContext.Items.Add("RouteTemplate", context.ActionDescriptor.AttributeRouteInfo.Template); 
     } 
    }