Что-то быстрее, чем HttpHandlers?

Каков самый быстрый способ выполнить метод на веб-сайте ASP.NET?

Сценарий довольно прост: у меня есть метод, который должен выполняться при попадании на веб-страницу. На странице больше ничего не происходит, выводится только сообщение «готово». Я хочу, чтобы обработка была максимально быстрой.

Каждое попадание уникально, поэтому кеширование невозможно.

Я планирую использовать HttpHandler и настроить его в web.config (mypage.ashx), а не на обычной странице .aspx. Это должно значительно снизить накладные расходы.

Итак, мой вопрос: есть ли более быстрый способ добиться этого, чем использование HttpHandlers?


person Jakob Gade    schedule 04.02.2009    source источник


Ответы (3)


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

Для справки, я написал рекламный сервер в ASP.NET (используя HttpHandlers), который может показывать рекламу (включая таргетинг и регистрацию показов в локальной базе данных) за 0-15 мс под нагрузкой. Я думал, что немного занимаюсь обработкой - но это довольно хорошее время отклика ИМХО.


Обновление через несколько месяцев:

Если вы очистите все HttpModules, которые включены по умолчанию, это удалит изрядное количество накладных расходов. По умолчанию следующие HttpModules включены в каждый сайт через файл web.config на уровне компьютера:

  • OutputCache
  • Сессия (для состояния сеанса)
  • WindowsAuthentication
  • ФормыАутентификация
  • Паспорт
  • RoleManager
  • UrlAuthorization
  • FileAuthorization
  • Анонимная идентификация
  • Профиль
  • ErrorHandler
  • ServiceModel

Как я уже сказал выше, мой рекламный сервер не использует ничего из этого, поэтому я только что сделал это в файле web.config этого приложения:

<httpModules>
   <clear />
</httpModules>

Если вам нужны некоторые из них, но не все, вы можете удалить те, которые вам не нужны:

<httpModules>
   <remove name="PassportAuthentication" />
   <remove name="Session" />
</httpModules>

Примечание для ASP.NET MVC. ASP.NET MVC требует модуля состояния сеанса, если вы не сделаете что-то особенное для его обхода. См. Этот вопрос для получения дополнительной информации: Как отключить сеанс состояние в ASP.NET MVC?

Обновление для IIS7: К сожалению, в IIS7 все не так просто. Вот как очистить HTTP-модули в IIS7 < / а>

person Daniel Schaffer    schedule 04.02.2009
comment
Ты мертв: я буду выполнять запись в базу данных. И я планировал создавать крошечные текстовые файлы, а не обращаться к базе данных. Файлы будут обработаны позже. Но исходя из вашего опыта и впечатляющего времени отклика, которого вы достигли, я просто воспользуюсь простым HttpHandler и доступом к базе данных. - person Jakob Gade; 04.02.2009
comment
Что мы сделали, так это поместили экземпляр SQL Express на веб-серверы, на которые выполняется запись, а затем есть задание, которое извлекает все данные с экземпляров веб-сервера на наш основной сервер SQL. - person Daniel Schaffer; 04.02.2009

Я не уверен, каков ваш точный сценарий, но если все, что ваша страница делает, это обрабатывает некоторые данные, вам вообще не нужна страница aspx или обработчик http. Вы можете написать веб-службу ASMX или службу WCF, чтобы делать то, что вам нужно, и это, скорее всего, приведет к меньшим накладным расходам. Службу WCF даже не обязательно размещать в ASP.NET. Вы можете разместить его из службы или консольного приложения Windows и вызывать внутри процесса, используя именованные каналы. Это, вероятно, значительно снизит накладные расходы на вызов кода обработки данных.

person davogones    schedule 04.02.2009
comment
Хороший звонок, мне и в голову не приходило, что это может быть внутренний процесс. Думаю, нам нужно больше узнать о том, что он делает. - person Daniel Schaffer; 04.02.2009
comment
Я буду делать некоторые вещи AJAX / javascript, где мне нужно зарегистрировать клиентское событие на сервере. Я не совсем уверен, как бы я выполнял сервисный метод WCF из js, но я определенно поработаю над этим в Google. :) На данный момент HttpHandlers, вероятно, для меня лучшее решение. Спасибо за ваши ответы. - person Jakob Gade; 04.02.2009
comment
Вызвать службу WCF из js на самом деле проще, чем вы думаете, особенно если вам не нужно иметь дело с возвращаемым значением (просто запустите и забудьте). См. msdn.microsoft.com/en-us/library/bb514961.aspx для получения дополнительной информации. - person davogones; 04.02.2009

Если вам действительно нужно использовать asp.net, вы также можете просто подключиться к шагу AuthorizeRequest и перехватить запрос оттуда, выполнить свою обработку и напрямую написать свой ответ Done.

person user134706    schedule 08.07.2009