在处理静态资源请求时获取Session的疑问。

chillystar chillystar 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在做一个伪静态处理,重写了HttpModule。

处理是在AcquireRequestState事件,已经通过web.config,设置所有的请求都经过AcquireRequestState。也就是说无论静态、动态或是任何态,只要是请求一定会引发AcquireRequestState事件。

但在调试时出现以下问题:
* 请求是一个准确的aspx或ashx页面时,正常获取session。
* 请求是一个存在的静态页面时,session=null。
* 请求是一个伪静态地址时(不存在该文件或虚拟目录),session=null。

测试过程:
第一步:先提交http://localhost:44172/default.aspx,结果为:
WebModule.context_AcquireRequestState:Session Enabled!
第二步:重新提交http://localhost:44172/default.aspx,结果为:
this's a test
WebModule.context_AcquireRequestState:Session Enabled!
第二步:提交http://localhost:44172/test.htm,结果为:
【显示test.htm登录页面】<--页面内容
WebModule.context_AcquireRequestState:Session Disable!
第四步:提交http://localhost:44172/gn=sim/login(红色部分是是一个作为参数的伪静态地址,实际并不存在。)结果:
WebModule.context_AcquireRequestState:Session Disable!


请问该如何处理,才能让静态资源也能取得Session?


关键代码如下:

public class WebModule : System.Web.IHttpModule, System.Web.SessionState.IRequiresSessionState
{
public void Init(System.Web.HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
void context_AcquireRequestState(object sender, EventArgs e)
{
System.Web.HttpContext context = (sender as System.Web.HttpApplication).Context;

// 处理伪静态地址信息。
if (context.Session == null) // Session空,未登录,调用并显示登录页面。
{
using (System.IO.FileStream fs = new System.IO.FileStream("d:\\webdata\\HTMLLogin.htm", System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
byte[] cxt = new byte[fs.Length];
fs.Read(cxt, 0, cxt.Length);
fs.Close();
context.Response.BinaryWrite(cxt);
}
}
else
{
if(context.Session["test"]==null)
{
context.Session.Add("test","this's a test");
}
else
{
context.Response.Write("<h4>WebModule.context_AcquireRequestState Value=:"+context.Session["test"].ToString()+"</h4><br />");
}
}

// 打印session测试结果。
context.Response.Write("<h4>WebModule.context_AcquireRequestState</h4><br />");
try
{
if (context.Session != null)
{
context.Response.Write("<h4 style='color:#ff0000;'>WebModule.context_AcquireRequestState:Session Enabled!</h4><br />");
}
else
{
context.Response.Write("<h4 style='color:#0000ff;'>WebModule.context_AcquireRequestState:Session Disable!</h4><br />");
}
}
catch (Exception)
{
context.Response.Write("<h4 style='color:#0000ff;'>WebModule.context_AcquireRequestState:Session Error!</h4><br />");
}
}
context.ApplicationInstance.CompleteRequest();
}

Web.config的相关配置修改:

<system.web>
……
<httpModules>
<add name="WebModule" type="WebApp.WebModule,WebApp" />
</httpModules>
……
</system.web>
<system.webServer>
……
<modules runAllManagedModulesForAllRequests="true">
……
</system.webServer>
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
chillystar
.NET社区 62,272 成员 668,968 内容