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

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

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

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

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

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

Ответ 1

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

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


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

Если вы очистите все 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

Ответ 2

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

Ответ 3

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