我有一个使用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?
答案 0 :(得分:3)
很难找到关于这个问题的任何正式文件,但看起来答案是否定的。即使您没有实现IRequiresSessionState
或IReadOnlySessionState
,如果您使用的是SQL Server会话提供程序,您仍会看到对TempResetTimeout
过程的调用。至少那是我在测试中发现的。
如果您确实希望在不使用完全禁用会话的单独Web应用程序的情况下避免会话,则可以创建HttpModule
,而不是使用HttpHandler
。这不是一种理想的方法,但在我的测试中确实有效。
基本上,您可以执行使用BeginRequest
事件处理程序所需的操作,并在BeginRequest
中完成请求(即通过调用context.ApplicationInstance.CompleteRequest()
)。如果您使用SQL事件探查器监视数据库,您将看到没有进行任何会话数据库调用。
我希望我有更好的答案,但这似乎是它的工作方式(无论如何在ASP.NET 4.0中)。