2011-07-13 9 views
0

クライアントからWebサービスリクエストを行っていると仮定します。要求はjsonのパラメータでPOSTによって行われます。
サーバーでは、Context.Request.RawUrlがリクエストURLを保持します。しかし、何がjsonデータの要求を保持していますか?ログリクエストjsonデータ

リクエストを記録するにはこのプロパティが必要です。ここで

は、HTTPモジュールのコードです:

public class RequestResponseLoggerModule : IHttpModule 
    { 
     //private static Logger logger = LogManager.GetCurrentClassLogger(); 

     #region ResponseCaptureStream 

     private class ResponseCaptureStream : Stream 
     { 
      private readonly Stream _streamToCapture; 
      private readonly Encoding _responseEncoding; 

      public string StreamContent { get; private set; }    

      public ResponseCaptureStream(Stream streamToCapture, Encoding responseEncoding) 
      { 
       _responseEncoding = responseEncoding; 
       _streamToCapture = streamToCapture; 
      } 

      public override bool CanRead { get { return _streamToCapture.CanRead; } } 
      public override bool CanSeek { get { return _streamToCapture.CanSeek; } } 
      public override bool CanWrite { get { return _streamToCapture.CanWrite; } } 
      public override long Length { get { return _streamToCapture.Length; } } 
      public override long Position 
      { 
       get { return _streamToCapture.Position; } 
       set { _streamToCapture.Position = value; } 
      } 


      public override void Flush() 
      { 
       _streamToCapture.Flush(); 
      }   

      public override int Read(byte[] buffer, int offset, int count) 
      { 
       return _streamToCapture.Read(buffer, offset, count); 
      } 

      public override long Seek(long offset, SeekOrigin origin) 
      { 
       return _streamToCapture.Seek(offset, origin); 
      } 

      public override void SetLength(long value) 
      { 
       _streamToCapture.SetLength(value); 
      } 

      public override void Write(byte[] buffer, int offset, int count) 
      { 
       StreamContent += _responseEncoding.GetString(buffer); 
       _streamToCapture.Write(buffer, offset, count); 
      } 

      public override void Close() 
      { 
       _streamToCapture.Close(); 
       base.Close(); 
      } 
     } 

     #endregion 

     #region IHttpModule Members 

     private HttpApplication _context; 
     public void Dispose() 
     { 

     } 

     private static string Extensions_Key = "RequestResponseLoggerModule.Extensions"; 
     private static string Files_Key = "RequestResponseLoggerModule.Files"; 
     private static string Request_Key = "RequestResponseLoggerModule.Request"; 
     private static string Response_Key = "RequestResponseLoggerModule.Response"; 

     private IEnumerable<string> _Extenstions = new string[] { }; 
     private IEnumerable<string> _Files = new string[] { }; 
     private bool _LogAlwaysRequest = false; 
     private bool _LogAlwaysResponse = false; 

     public void Init(HttpApplication context) 
     { 
      _Extenstions = ConfigurationManager.AppSettings[Extensions_Key].ToLower().Split(','). 
       Select(x => x.Trim()).ToArray(); 
      _Files = ConfigurationManager.AppSettings[Files_Key].ToLower().Split(','). 
       Select(x => x.Trim()).ToArray(); 
      _LogAlwaysRequest = ConfigurationManager.AppSettings[Request_Key] == "ALWAYS"; 
      _LogAlwaysResponse = ConfigurationManager.AppSettings[Response_Key] == "ALWAYS"; 

      _context = context; 

      context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); 
      context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent); 
     } 

     void context_PreRequestHandlerExecute(object sender, EventArgs e) 
     { 
      _context.Response.Filter = new ResponseCaptureStream(_context.Response.Filter, _context.Response.ContentEncoding); 
     } 

     void context_PreSendRequestContent(object sender, EventArgs e) 
     { 
      bool isMatch = false; 
      if (_Extenstions.Count() > 0) 
      { 
       string ext = VirtualPathUtility.GetExtension(_context.Request.FilePath). 
        Substring(1).ToLower(); 
       if (_Extenstions.Contains(ext)) 
       { 
        isMatch = true; 
       } 
      } 
      if (_Files.Count() > 0) 
      { 
       string fileName = VirtualPathUtility.GetFileName(_context.Request.FilePath).     ToLower(); 
       if (_Files.Contains(fileName)) 
       { 
        isMatch = true; 
       } 
      } 

      if (_LogAlwaysRequest || isMatch) 
      { 
       string requestText = _context.Request.RawUrl; <------------------ 

       //log the responseText, but this reurns just the url while I need the data of the webservice call 
      } 
      if (_LogAlwaysResponse || isMatch) 
      { 
       ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream; 
       if (filter != null) 
       { 
        string responseText = filter.StreamContent; 
        //log the responseText 
       } 
      }   
     } 

     #endregion 
    } 
+0

私たちがあなたがしようとしていることを正確に知るために、より多くの情報を質問に入れることができますか? – Steve

+0

送信した内容を正確に把握することができますか? –

答えて

1
public class RequestResponseLoggerModule : IHttpModule 
{ 
    //private static Logger logger = LogManager.GetCurrentClassLogger(); 

    #region CaptureStream 

    private class CaptureStream : Stream 
    { 
     private readonly Stream _streamToCapture; 
     private readonly Encoding _encoding; 

     public string StreamContent { get; private set; } 

     public CaptureStream(Stream streamToCapture, Encoding encoding) 
     { 
      _encoding = encoding; 
      _streamToCapture = streamToCapture; 
     } 

     public override bool CanRead { get { return _streamToCapture.CanRead; } } 
     public override bool CanSeek { get { return _streamToCapture.CanSeek; } } 
     public override bool CanWrite { get { return _streamToCapture.CanWrite; } } 
     public override long Length { get { return _streamToCapture.Length; } } 
     public override long Position 
     { 
      get { return _streamToCapture.Position; } 
      set { _streamToCapture.Position = value; } 
     } 


     public override void Flush() 
     { 
      _streamToCapture.Flush(); 
     }   

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _streamToCapture.Read(buffer, offset, count); 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      return _streamToCapture.Seek(offset, origin); 
     } 

     public override void SetLength(long value) 
     { 
      _streamToCapture.SetLength(value); 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      StreamContent += _encoding.GetString(buffer); 
      _streamToCapture.Write(buffer, offset, count); 
     } 

     public override void Close() 
     { 
      _streamToCapture.Close(); 
      base.Close(); 
     } 
    } 

    #endregion 

    #region IHttpModule Members 

    private HttpApplication _context; 
    public void Dispose() 
    { 

    } 

    private static string Extensions_Key = "RequestResponseLoggerModule.Extensions"; 
    private static string Files_Key = "RequestResponseLoggerModule.Files"; 
    private static string Request_Key = "RequestResponseLoggerModule.Request"; 
    private static string Response_Key = "RequestResponseLoggerModule.Response"; 

    private IEnumerable<string> _Extenstions = new string[] { }; 
    private IEnumerable<string> _Files = new string[] { }; 
    private bool _LogAlwaysRequest = false; 
    private bool _LogAlwaysResponse = false; 
    private bool _IsMatch = false; 

    public void Init(HttpApplication context) 
    { 
     _Extenstions = ConfigurationManager.AppSettings[Extensions_Key].ToLower().Split(','). 
      Select(x => x.Trim()).ToArray(); 
     _Files = ConfigurationManager.AppSettings[Files_Key].ToLower().Split(','). 
      Select(x => x.Trim()).ToArray(); 
     _LogAlwaysRequest = ConfigurationManager.AppSettings[Request_Key] == "ALWAYS"; 
     _LogAlwaysResponse = ConfigurationManager.AppSettings[Response_Key] == "ALWAYS"; 

     _context = context; 

     context.BeginRequest += new EventHandler(context_BeginRequest); 
     context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent); 
    } 

    void context_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     _context.Response.Filter = new CaptureStream(_context.Response.Filter, _context.Response.ContentEncoding); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     if (_Extenstions.Count() > 0) 
     { 
      string ext = VirtualPathUtility.GetExtension(_context.Request.FilePath). 
       Substring(1).ToLower(); 
      if (_Extenstions.Contains(ext)) 
      { 
       _IsMatch = true; 
      } 
     } 
     if (_Files.Count() > 0) 
     { 
      string fileName = VirtualPathUtility.GetFileName(_context.Request.FilePath).ToLower(); 
      if (_Files.Contains(fileName)) 
      { 
       _IsMatch = true; 
      } 
     } 

     if (_LogAlwaysRequest || _IsMatch) 
     { 
      StreamReader reader = new StreamReader(_context.Request.InputStream); 
      string requestText = reader.ReadToEnd(); 
      _context.Request.InputStream.Position = 0; 
      //LOG requestText 
     } 
    } 

    void context_PreSendRequestContent(object sender, EventArgs e) 
    { 
     if (_LogAlwaysResponse || _IsMatch) 
     { 
      CaptureStream filter = _context.Response.Filter as CaptureStream; 
      if (filter != null) 
      { 
       string responseText = filter.StreamContent; 
       //LOG responseText 
      } 
     } 
    } 

    #endregion 
} 
+0

私たちは問題があります。文字列responseText = filter.StreamContent;バイナリ形式になっています。 jsonデータをクライアントに送信する前にフィルタリングしようとしています。私たちは正しい方法でやっていますか?私にアドバイスできますか? ARR拡張を有効にしてIISでこれを確認しています。 – user867662

2

あなたがペイロードにJSONをPOSTを行った場合、その後、あなたがリクエストボディを読む必要があります。あなたは、例えば、Request.InputStreamを消費することによってこれを行うだろう:

 string json; 
     using (var reader = new StreamReader(Request.InputStream)) 
     { 
      json = reader.ReadToEnd(); 
     } 

あなたはしかし、注意する必要がある - 体を消費すると、あなたの実際コードがそれを読んでいないことを意味するかもしれないからです。どちらが悪いですか。

+0

♦それでは、体を消費することなく、どうすればいいのですか?.. – Naor

+0

@Naor - not easily簡単に –

+0

リクエストデータを記録する方法はありませんか? – Naor