在我的程序中,我试图在IHttpModule中使用会话变量。这是我的密码。这在VS 2010开发服务器中运行得很好。但是,当我尝试在IIS7中调试时,它会显示异常System.Web.HttpException: Session state is not available in this context,那么为什么IIS7中没有会话,而在开发服务器中可用。
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";
}
}发布于 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 以外的文件调用请在这里提供帮助。
这是最后的代码
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文件时使用会话
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";
} 发布于 2014-01-16 07:43:02
您所需要的只是实现IRequiresSessionState。
因此,您的代码应该如下所示:
public class Globalizer : IHttpModule, IRequiresSessionState如果您只使用读取会话(并且永远不要更新它们),那么您应该使用IReadOnlySessionState,因为最后一次不要锁定会话状态,因此,您将不会有并发请求)。
发布于 2014-01-16 07:30:44
如果可能,将处理程序移动到PostAcquireRequestState处理程序:
当获得与当前请求关联的请求状态(例如,会话状态)时发生。
(或更晚的事件)
SessionStateModule本身加载会话状态以响应AcquireRequestState事件-因此,目前取决于您的模块还是会话状态模块的处理程序首先启动。
https://stackoverflow.com/questions/21155567
复制相似问题