首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话在IHttpModule中不可用

会话在IHttpModule中不可用
EN

Stack Overflow用户
提问于 2014-01-16 07:17:14
回答 4查看 2K关注 0票数 4

在我的程序中,我试图在IHttpModule中使用会话变量。这是我的密码。这在VS 2010开发服务器中运行得很好。但是,当我尝试在IIS7中调试时,它会显示异常System.Web.HttpException: Session state is not available in this context,那么为什么IIS7中没有会话,而在开发服务器中可用。

代码语言:javascript
复制
using System;
using System.Web;

public class Globalizer : IHttpModule
{    
  public void Init(HttpApplication context)
  {
    context.AcquireRequestState += new EventHandler(setLanguage);
  }

  public void Dispose(){}

  public void setLanguage(Object sender, EventArgs i_eventArgs)
  {
    HttpApplication http_application = sender as HttpApplication;     
    http_application.Session["language"] = "test";

  }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-16 08:33:07

找到了原因。

如果是因为AcquireRequestState触发的所有文件,如CSS,JS,图像。那些文件没有会话。

解决方案:似乎有一种方法可以避免对所有请求调用IHttpModule。嘲笑这个答案,JS,Images and CSS getting intercepted by HTTPModule

但这对我没用。因此,我使用HttpContext.Current.Session而不是HttpApplication.Session,每次它检查会话在保存到会话之前是否为null。

如果有人知道,如何避免对IHttpModule .aspx 以外的文件调用请在这里提供帮助。

这是最后的代码

代码语言:javascript
复制
using System;
using System.Web;

public class Globalizer : IHttpModule
{    
  public void Init(HttpApplication context)
  {
    context.AcquireRequestState += new EventHandler(setLanguage);
  }

  public void Dispose(){}

  public void setLanguage(Object sender, EventArgs i_eventArgs)
  {
    if(HttpContext.Current.Session != null){
      HttpContext.Current.Session["language"] = "test";
    }

  }
}

编辑:的另一种方式是只在请求到达.aspx文件时使用会话

代码语言:javascript
复制
HttpApplication http_application = sender as HttpApplication; 
HttpContext context = http_application.Context;
if(Path.GetExtension(context.Request.PhysicalPath) == ".aspx")
{
 HttpContext.Current.Session["language"] = "test";
 http_application.Session["language2"] = "test2";
} 
票数 0
EN

Stack Overflow用户

发布于 2014-01-16 07:43:02

您所需要的只是实现IRequiresSessionState

因此,您的代码应该如下所示:

代码语言:javascript
复制
public class Globalizer : IHttpModule, IRequiresSessionState

如果您只使用读取会话(并且永远不要更新它们),那么您应该使用IReadOnlySessionState,因为最后一次不要锁定会话状态,因此,您将不会有并发请求)。

票数 1
EN

Stack Overflow用户

发布于 2014-01-16 07:30:44

如果可能,将处理程序移动到PostAcquireRequestState处理程序:

当获得与当前请求关联的请求状态(例如,会话状态)时发生。

(或更晚的事件)

SessionStateModule本身加载会话状态以响应AcquireRequestState事件-因此,目前取决于您的模块还是会话状态模块的处理程序首先启动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21155567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档