使用HTTPHandler时禁用会话状态访问

时间:2013-04-24 16:12:13

标签: c# asp.net session

我有一个使用IHTTPHandler的类,并且没有实现 IRequiresSessionState IReadOnlySessionState 。我仍然看到它访问我们的会话提供程序,导致过度使用。

堆栈跟踪:     HttpRuntime.ProcessRequestInternal =>     HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest =>     ApplicationStepManager.ResumeSteps =>     HttpApplication.ExecuteStep =>     AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute =>     SessionStateModule.BeginAcquireState =>     SessionStateProvider.ResetItemTimeout =>     SessionStateItem.Save

有没有办法告诉HttpHandler不使用Session?

1 个答案:

答案 0 :(得分:3)

很难找到关于这个问题的任何正式文件,但看起来答案是否定的。即使您没有实现IRequiresSessionStateIReadOnlySessionState,如果您使用的是SQL Server会话提供程序,您仍会看到对TempResetTimeout过程的调用。至少那是我在测试中发现的。

如果您确实希望在不使用完全禁用会话的单独Web应用程序的情况下避免会话,则可以创建HttpModule,而不是使用HttpHandler。这不是一种理想的方法,但在我的测试中确实有效。

基本上,您可以执行使用BeginRequest事件处理程序所需的操作,并在BeginRequest中完成请求(即通过调用context.ApplicationInstance.CompleteRequest())。如果您使用SQL事件探查器监视数据库,您将看到没有进行任何会话数据库调用。

我希望我有更好的答案,但这似乎是它的工作方式(无论如何在ASP.NET 4.0中)。