Регистрация необработанных HTTP-запросов / ответов в ASP.NET MVC & IIS7 - PullRequest
135 голосов
/ 24 июня 2009

Я пишу веб-сервис (использующий ASP.NET MVC), и в целях поддержки мы хотели бы иметь возможность регистрировать запросы и ответы как можно ближе к необработанному формату на проводе ( т. е. включая HTTP-метод, путь, все заголовки и тело) в базу данных.

В чем я не уверен, так это в том, как получить эти данные наименее «изуродованным» способом. Я могу воссоздать то, на что, по моему мнению, выглядит запрос, проверив все свойства объекта HttpRequest и построив из них строку (и аналогично для ответа), но я бы очень хотел получить фактический запрос / данные ответа, которые отправляются по проводам.

Я рад использовать любой механизм перехвата, такой как фильтры, модули и т. Д., И решение может быть специфичным для IIS7. Однако я бы предпочел хранить его только в управляемом коде.

Любые рекомендации?

Редактировать: Замечу, что HttpRequest имеет метод SaveAs, который может сохранить запрос на диск, но при этом он восстанавливает запрос из внутреннего состояния, используя загрузку внутренних вспомогательные методы, к которым нельзя получить доступ публично (почему бы не разрешить сохранение в предоставленный пользователем поток, я не знаю). Так что, похоже, мне придется приложить все усилия, чтобы восстановить текст запроса / ответа из объектов ... Стон.

Редактировать 2: Обратите внимание, что я сказал запрос целом , включая метод, путь, заголовки и т. Д. Текущие ответы смотрят только на потоки тела, которые не содержат эту информацию.

Редактировать 3: Здесь никто не читает вопросы? Пока пять ответов, но ни один из них не намекает на то, как получить весь необработанный запрос по проводам. Да, я знаю, что могу захватывать выходные потоки и заголовки, а также URL-адреса и все такое из объекта запроса. Я уже говорил, что в вопросе см .:

Я могу воссоздать то, на что, по моему мнению, выглядит запрос, проверив все свойства объекта HttpRequest и построив из них строку (и аналогично для ответа), но я бы очень хотел получить фактический запрос / ответные данные, отправленные по проводам.

Если вы знаете, что complete raw data (включая заголовки, URL, http-метод и т. Д.) Просто не могут быть извлечены, то это было бы полезно знать. Точно так же, если вы знаете, как получить все это в необработанном формате (да, я по-прежнему имею в виду, включая заголовки, URL, метод http и т. Д.) Без необходимости реконструировать его, что я и просил, тогда это было бы очень полезно. Но говорить мне, что я могу восстановить его из объектов HttpRequest / HttpResponse, бесполезно. Я знаю это. Я уже сказал это.


Обратите внимание: прежде чем кто-либо начнет говорить, что это плохая идея или ограничит масштабируемость и т. Д., Мы также будем реализовывать механизмы регулирования, последовательной доставки и предотвращения повторного воспроизведения в распределенной среде, поэтому база данных В любом случае требуется регистрация. Я не ищу обсуждение того, является ли это хорошей идеей, я ищу, как это можно сделать.

Ответы [ 15 ]

0 голосов
/ 13 июня 2010

Лучше сделать это за пределами вашего приложения. Вы можете настроить обратный прокси-сервер, чтобы делать такие вещи (и многое другое). Обратный прокси-сервер - это, в основном, веб-сервер, который находится в вашей серверной комнате и стоит между вашим веб-сервером (серверами) и клиентом. Смотри http://en.wikipedia.org/wiki/Reverse_proxy

0 голосов
/ 02 июля 2009

Я согласен с остальными, использую IHttpModule. Посмотрите на ответ на этот вопрос, который делает почти то же самое, что вы спрашиваете. Он регистрирует запрос и ответ, но без заголовков.

Как отследить запросы ScriptService WebService?

0 голосов
/ 02 июля 2009

Я знаю, что это не управляемый код, но я собираюсь предложить фильтр ISAPI. Прошло несколько лет с тех пор, как я имел «удовольствие» от поддержания собственного ISAPI, но, насколько я помню, вы можете получить доступ ко всему этому, как до, так и после того, как ASP.Net сделал это.

http://msdn.microsoft.com/en-us/library/ms524610.aspx

Если HTTPModule не достаточно хорош для того, что вам нужно, то я просто не думаю, что есть какой-либо управляемый способ сделать это с требуемым количеством деталей. Это будет боль, хотя сделать.

0 голосов
/ 30 июня 2009

Согласитесь с FigmentEngine, похоже, что IHttpModule - это путь.

Посмотрите на httpworkerrequest, readentitybody и GetPreloadedEntityBody.

Чтобы получить httpworkerrequest, вам нужно сделать следующее:

(HttpWorkerRequest)inApp.Context.GetType().GetProperty("WorkerRequest", bindingFlags).GetValue(inApp.Context, null);

, где inApp - это объект httpapplication.

0 голосов
/ 25 июня 2009

HttpRequest и HttpResponse pre MVC имели GetInputStream() и GetOutputStream(), которые можно использовать для этой цели. Я не заглядывал в эти части в MVC, поэтому я не уверен, что они доступны, но это может быть идеей:)

...