2009-02-04 4 views
17

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

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

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

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

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

ответ

25

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

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


Update после нескольких месяцев:

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

  • OutputCache
  • сессии (состояния сеанса)
  • WindowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • РольManager
  • UrlAuthorization
  • FileAuthorization
  • AnonymousIdentification
  • Профиль
  • ErrorHandler
  • ServiceModel

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

<httpModules> 
    <clear /> 
</httpModules> 

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

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

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

Обновление для IIS7: К сожалению, в IIS7 все не так просто. Вот how to clear HTTP Modules in IIS7

+0

Вы мертвы: я буду выполнять некоторые записи в базу данных. И я планировал создавать крошечные текстовые файлы, а не идти в db. Файлы будут обработаны позже. Но, основываясь на вашем опыте и впечатляющем успехе, который вы достигли, я просто продолжу простой доступ HttpHandler и db. –

+1

Что мы сделали, это положить экземпляр SQL Express на веб-серверы, на который записывается, а затем есть задание, которое вытаскивает все данные из экземпляров веб-сервера в наш основной SQL-сервер. –

+0

Awesome, спасибо за обновление. Очень полезно. –

1

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

+0

Хороший звонок, мне не приходило в голову, что это может быть внутренний процесс. Думаю, нам нужно больше узнать о том, что он делает. –

+0

Я буду делать некоторые вещи AJAX/javascript, где мне нужно зарегистрировать событие на стороне клиента на сервере. Я не совсем уверен, как я буду использовать метод службы WCF из js, но я обязательно буду заниматься поиском по этой теме. :) На данный момент HttpHandlers - лучшее решение для меня. Спасибо за ваши ответы. –

+0

Вызов службы WCF из js на самом деле проще, чем вы думаете, особенно если вам не нужно иметь дело с возвращаемым значением (просто стрелять и забыть). Дополнительную информацию см. На странице http://msdn.microsoft.com/en-us/library/bb514961.aspx. – davogones

0

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