2011-07-13 83 views
0

假設我正在從客戶端進行web服務請求。該請求由POST和json參數完成。
在服務器中,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,那麼你需要讀取請求體。你會通過消耗Request.InputStream,例如這樣做:

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

你必須要小心,雖然 - 因爲消耗體內可能意味着你的實際代碼無法讀它。這將是不好的。

+0

♦那我該怎麼做纔不消耗身體? – Naor

+0

@Naor-不容易 –

+0

所以沒有辦法記錄請求數據? – Naor