2013-04-24 3 views
2

У меня есть класс, который использует IHttpHandler и не реализует IRequiresSessionState или IReadOnlySessionState. Я все еще вижу, что он обращается к нашему провайдеру сеанса, что вызывает чрезмерное использование.Отключить состояние сеанса доступа при использовании HttpHandler

Трассировка стека: HttpRuntime.ProcessRequestInternal => HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest => ApplicationStepManager.ResumeSteps => HttpApplication.ExecuteStep => AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep. Выполнить => SessionStateModule.BeginAcquireState => SessionStateProvider.ResetItemTimeout => SessionStateItem.Save

есть ли способ сказать HttpHandler не использовать Session?

ответ

2

Трудно найти какую-либо официальную документацию по этому вопросу (есть небольшая информация here), но похоже, что ответ отрицательный. Даже если вы не реализуете IRequiresSessionState или IReadOnlySessionState, если вы используете провайдер сеансов SQL Server, вы все равно увидите вызов процедуры TempResetTimeout. По крайней мере, это то, что я нашел из моего тестирования.

Если вы действительно хотите избежать сеанса без использования отдельного веб-приложения с отключенным сеансом, вы можете создать HttpModule вместо использования HttpHandler. Это не идеальный подход, но в моем тестировании он действительно работал.

В основном, вы делаете то, что вам нужно для использования обработчика событий BeginRequest, и заполните запрос в BeginRequest (то есть, позвонив по телефону context.ApplicationInstance.CompleteRequest()). Если вы заглянете в базу данных с помощью SQL Profiler, вы увидите, что вызовы базы данных сеанса не выполняются.

Мне жаль, что у меня не было лучшего ответа, но похоже, что это работает (в ASP.NET 4.0 в любом случае).