2017-02-22 18 views

答えて

2

それは一般的にASP.NETコア・パイプラインで実行される最後のミドルウェアであることを起こるMVCミドルウェアによって作成されるので、カスタムミドルウェアからのルートデータを取得することは容易ではありません。

あなたは以下のようにあなたのミドルウェアでのリクエストとレスポンスを記録したい場合は、ルートデータ中に本当に興味を持っている場合、

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 GETルートはhereをmiidleware実装するために答えます

他の代替的なアプローチは、要求/応答ロギング用Action Filtersを使用することです。ここで

+0

コード例では、実際のリクエストURLが記録されます。私はルートテンプレートを記録したかったのです。/products/product123の代わりに/ 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); 
     } 
    } 
関連する問題