2017-02-22 5 views
0

У меня есть промежуточное программное обеспечение, которое вызывается для каждого запроса к моим API. Я хочу зарегистрировать шаблон маршрута вместе с длительностью запроса от этого промежуточного программного обеспечения. Как получить шаблон маршрута в моем промежуточном коде? Шаблон маршрута похож на «/ products/{productId}».ASP.Net core-получение значения маршрутизации от промежуточного программного обеспечения

ответ

2

Непросто получить данные маршрута из специального промежуточного программного обеспечения, поскольку оно создается промежуточным программным обеспечением 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); 
    } 

Однако, если вы действительно заинтересованы в данных маршрутов, есть очень хороший SO ответа реализовать Узнавайте маршруты miidleware here

Другим альтернативным подходом было бы использовать Action Filters для ведения журнала запросов/ответов.

+0

Ваш пример кода журнала действительный запрос URL. Я хотел зарегистрировать шаблон маршрута. то есть вместо/products/product123 Мне нужно log/products/{productId}. Тем не менее, я могу получить это с помощью Action Filter. Спасибо за эту информацию. – 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); 
     } 
    } 
Смежные вопросы