2011-03-24 34 views
0

对于一组特定的动作,我需要记录传入的请求InputStream以及传出的Response.OutputStream。如何在我的ASP.NET MVC3应用程序中为特定操作记录Request.InputStream和Response.OutputStream流量?

我设想使用ActionFilterAttribute来覆盖OnActionExecuted和OnResultExecuted方法。

所以我开始这个想法...

public class ActionLoggerAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

     HttpRequestBase request = filterContext.HttpContext.Request; 
     // TODO: Log the Request.InputStream 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 

     HttpResponseBase response = filterContext.HttpContext.Response; 
     // TODO: Log the Response.OutputStream 
    } 
} 

理想的情况下我就与企业库记录,因为我已经在使用它的错误日志记录挂钩这件事。

  1. 我在适当的时间访问输入和输出流吗?
  2. 我可以使用企业库轻松记录流?
  3. 对我的问题有没有完全不同的更好的解决方案?

谢谢!

+0

所以,我已经发现,使用OnActionExecuting比OnActionExecuted效果更好。 Request.Input流首先是空的。但是,我仍然在努力记录Response.OutputStream。它似乎是只写,我需要阅读它! – Justin 2011-03-24 22:38:52

回答

1

为了捕获响应,你可以使用一个response filter

public class CaptureResponse : MemoryStream 
{ 
    private readonly Stream _stream; 
    public CaptureResponse(Stream stream) 
    { 
     _stream = stream; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     // TODO: Log the response buffer here 
     // (note that it could be a chunk) 

     _stream.Write(buffer, offset, count); 
    } 
} 

,那么你可以有一个自定义操作属性:

public class ActionLoggerAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var response = filterContext.HttpContext.Response; 
     response.Filter = new CaptureResponse(response.Filter); 

     // TODO: Log the Request.InputStream 

     base.OnActionExecuting(filterContext); 
    } 
} 
+0

谢谢@Darin,对不起,我花了这么长时间才接受我使用了解决方案,但只是有机会使用您的解决方案进行清理。 – Justin 2011-04-19 18:35:07

相关问题