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

本文关键字:会话状态 访问 HTTPHandler 使用 | 更新日期: 2023-09-27 18:10:39

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

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

是否有办法告诉HttpHandler不使用会话?

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

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

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

基本上,您可以使用BeginRequest事件处理程序并在BeginRequest中完成请求(即通过调用context.ApplicationInstance.CompleteRequest())。如果您使用SQL Profiler监视数据库,您将看到没有进行Session数据库调用。

我希望我有一个更好的答案,但这似乎是它的工作方式(在ASP。