2012-03-06 2 views
3

У меня есть пользовательский IHttpModule, который используется для регистрации всех HTTP-запросов и ответов, и в настоящее время он работает очень хорошо, но я бы хотел его расширить поэтому я могу определить, сколько времени ответит на самом деле.Могу ли я перехватить после того, как ответ был отправлен клиенту в модуле IHttpModule

Ответ регистрируется в событии HttpApplication.EndRequest, но это событие срабатывает до того, как запрос действительно отправлен веб-клиенту. Хотя это позволяет мне определить, сколько времени потребовалось серверу для обработки ответа, я также хотел бы узнать, сколько времени на самом деле понадобилось клиенту для получения ответа.

Есть ли событие или какой-либо другой механизм, который позволит мне перехватить после того, как клиент закончит получать ответ?

+0

Вкратце ... нет. Сервер не имеет видимости, когда клиент получил данные, вам нужно будет использовать javascript для возврата на сервер. Они представляют собой много примеров этого, как открытого, так и коммерческого. Попробуйте интегрировать Glimpse –

+0

Для приложений, которые меня больше всего интересуют протоколирование, я не контролирую клиентов, и эти клиенты делают SOAP-вызовы через HTTP. Похоже, ваш подход не будет осуществимым для моих нужд. Спасибо, в любом случае. – Cleggy

+0

, как лучше всего вы могли бы работать, когда последний байт покинул сервер, но это по сути то же самое, что и журналы IIS, и, вероятно, потребуется фильтр ISAPI. –

ответ

0

да вы могли бы справиться с HttpApplication.EndRequest

+0

Нет, это последнее событие, которое срабатывает в цепочке HTTP-конвейера, но оно все еще срабатывает, прежде чем контент будет фактически отправлен клиенту. – Cleggy

+0

с небуферизованным ответом, он должен указать, что клиент получил все байты. Потому что они отправляют прямо по линии (исправьте меня, если я ошибаюсь). Я читаю http://msdn.microsoft.com/en-us/magazine/cc188942.aspx, и он показывает, что он немного отличается для буферизованного ответа (по умолчанию) –

0

другим способом может быть зацепить (пример: окна обслуживания, чтобы написать ответ время в базу данных) в ваш веб-сервер (IIS) и проследить тот events.if вы хотите проанализировать время, клиент должен получить ваш контент.

но я думаю, iis уже в состоянии сделать так.

это зависит немного, что вы хотите сделать.

1

Для этого потребуется код на стороне клиента. Но не совсем ясно, что вы хотите измерить. От минимального до самого большого могут быть установлены

  1. Время внутри серверного приложения - измеряется кодом, который у вас уже есть.
    • Ваш код может установить начало либо из «Now()» при его запуске, либо с использованием объектов HTTP. Первый звонок на сайт увидел бы большую разницу между этими временами начала, иначе они должны быть почти одинаковыми.
  2. время на веб-сайте сервера - я считаю, что это уже измеряется большинством услуг хостинга, таких как IIS.
  3. серверная машина - я считаю, что это то, о чем говорит «mo». Вам придется иметь какой-то внешний мониторинг на серверной машине, ala WireShark.
  4. клиентская машина - опять же, вам придется иметь внешний мониторинг на клиентской машине. Это было бы труднее всего получить, но я думаю, это действительно то, о чем вы просите.
  5. клиентское приложение - это то, что вы можете измерить с помощью javascript.

Если это не является «первым звонком» (см Slow first page load on asp.net site или ASP.NET application on IIS7 - very slow startup after iisreset), я считаю, что все это время будет просто так близко, что вы можете использовать «достаточно хороший» подход вместо этого.

Если вы должен иметь меру этот вызов «ы время клиента, то вы застряли в плохом месте. Но если вам просто нужны лучшие цифры, просто продолжайте измерять 1. (время приложения) с тем, что у вас уже есть, и не забудьте также измерить размер запроса и ответа.

Затем установите базовую линию для настройки этого времени путем тестирования на разных целевых клиентских машинах.

  • Measure пинг разы от клиента к вашему серверу
  • раз передачи
  • Меры умеренно большого содержания - как загружать и выгружать
  • надувать цифры, чтобы получить диспашу

Вы должны закончить с такой формулой, как:

[AdjustedTime] = [PingTime] + [ServerTime] 
+ ([UploadSpeed] * [RequestSize]) 
+ ([DownloadSpeed] * [ResponseSize]); 

Это ожидаемый ответ клиента t IME.

+0

Вам не хватает того, что я просил. Мне нужен способ определить, сколько времени потребовалось до того, как клиент действительно получил и завершил обработку ответа. Чтобы сделать это, мне нужно как-то подключиться непосредственно после того, как клиент закончил получать ответ. – Cleggy

+0

(Исправление, да, я неправильно понял вопрос) – Abacus

+0

Спасибо за подробный ответ. К сожалению, я искал решение, которое не касалось участия на стороне клиента, поскольку я хотел профилировать SOAP-сервис и веб-сайт ASP.NET, который вызывается сторонними клиентами, у меня нет контроля. Поскольку, как представляется, нет способа сделать это с помощью структуры ASP.NET, мое «решение» должно было полностью опустить эту метрику. – Cleggy