我写了一个webapi,想在module中获取请求的信息和返回的信息,写进log里,以方便以后查询。request信息很容易能拿到,但是返回信息得费一番周折。不多说,上代码
public class ResponseLoggerModule : IHttpModule {private class ResponseCaptureStream : Stream{private readonly Stream _streamToCapture;private readonly Encoding _responseEncoding;private string _streamContent;public string StreamContent{get { return _streamContent; }private set{_streamContent = value;}}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 void Flush(){_streamToCapture.Flush();}public override long Length{get { return _streamToCapture.Length; }}public override long Position{get{return _streamToCapture.Position;}set{_streamToCapture.Position = value;}}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();}}#region IHttpModule Membersprivate HttpApplication _context;public void Dispose(){}public void Init(HttpApplication context){_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){ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream;if (filter != null){string responseText = filter.StreamContent;// Logging logic here }}#endregion }
参考文献:http://stackoverflow.com/questions/386487/capturing-html-generated-from-asp-net