3

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

堆栈跟踪: 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?

4

1 回答 1

3

很难找到有关此问题的任何正式文档,但看起来答案是否定的。即使您不实现IRequiresSessionStateor IReadOnlySessionState,如果您使用的是 SQL Server 会话提供程序,您仍然会看到对该TempResetTimeout过程的调用。至少这是我从测试中发现的。

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

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

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

于 2013-08-01T17:57:53.410 回答