Что-то быстрее, чем HttpHandlers? - PullRequest
18 голосов
/ 04 февраля 2009

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

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

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

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

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

Ответы [ 3 ]

26 голосов
/ 04 февраля 2009

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

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


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

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

  • OutputCache
  • Сеанс (для состояния сеанса)
  • WindowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • RoleManager
  • UrlAuthorization
  • FileAuthorization
  • AnonymousIdentification
  • Профиль
  • 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

1 голос
/ 04 февраля 2009

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

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

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

...