2017-12-10 21 views
0

アクションによって返された応答を読み込み、そこからデータを収集してログに記録するアクションフィルタを作成していますが、応答本文を読み取ることができる場所を見つけることができません。私は、HttpContext内のresponeでプロパティ名OutputStreamにアクセスするために次のコードを試しましたが、LengthプロパティとReadメソッドがこのストリームでサポートされていないというエラーが表示され続けます。MVCでHttpContextの応答本体を読み込みます

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
      byte[] buffer = new byte[filterContext.HttpContext.Response.OutputStream.Length];         
      using (MemoryStream ms = new MemoryStream()) 
      { 
       int read; 
       while ((read = filterContext.HttpContext.Response.OutputStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       string html = Encoding.UTF8.GetString(ms.ToArray()); 
      } 
    } 
+0

https://stackoverflow.com/questions/20930453/mvc-filterattribute-to-get-response-lengthヘルプ? – mjwills

+0

いいえ、残念ながら。 – Sisyphus

+0

https://stackoverflow.com/questions/17462995/simple-way-to-calculate-response-length-in-mvc4は助けになりませんでしたか? – mjwills

答えて

0

「ストリーム」からは抽出できないため、「結果データ」を使用してログにデータを取得することにしました。

public class LogResultFilter : IActionFilter, IResultFilter 
{ 
    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 

     var responseBody = string.Empty; 
     if (filterContext.Result is ViewResultBase) 
     { 
      responseBody = new JavaScriptSerializer().Serialize(((ViewResultBase)filterContext.Result).ViewData); 
     } 

     if (filterContext.Result is JsonResult) 
     { 
      responseBody = new JavaScriptSerializer().Serialize(((JsonResult)filterContext.Result)); 
     } 

     // Continue... 
関連する問題