Как я могу регистрировать трафик Request.InputStream и Response.OutputStream в моем приложении ASP.NET MVC3 для определенных действий? - PullRequest
0 голосов
/ 24 марта 2011

Для определенного набора действий мне необходимо регистрировать входящие запросы 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
    }
}

В идеале я просто подключу это к журналу Enterprise Library, так как я уже использую его для регистрации ошибок.

  1. Получаю ли я доступ к входным и выходным потокам в соответствующее время?
  2. Можно ли использовать корпоративную библиотеку для удобной регистрации потоков?
  3. Есть ли совсем другое и лучшее решение моей проблемы?

Спасибо!

1 Ответ

1 голос
/ 25 марта 2011

Для захвата ответа вы можете использовать фильтр ответов :

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);
    }
}
...