怎样在HttpModule捕获到session?

binny0532 2007-02-26 10:13:59
HttpModule如下:


public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}

void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
string url = application.Request.Url.ToString();

string userName = Convert.ToString(application.Session["UserName"]);

......



application.Session["UserName"]出错:会话状态在此上下文中不可用

请问怎样在HttpModule中获得Session? 请帮忙,多谢了。。
...全文
2443 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
wskicfuu 2011-12-13
  • 打赏
  • 举报
回复
module类 中无法获取Session

帮顶
尽情年轻 2011-10-31
  • 打赏
  • 举报
回复
qxyywy 2011-06-23
  • 打赏
  • 举报
回复
34楼的 意思是如何处理 ?未懂?
wwwhhhyyy190200 2011-05-08
  • 打赏
  • 举报
回复
你在httpModule中,操作的不是同一个application,你在自定义方法中用了一个新的application
:
public void Init(HttpApplication application)
{
application. AcquireRequestState += (new
EventHandler(this.Application_AcquireRequestState));
}
private void Application_AcquireRequestState (Object source,
EventArgs e)
{
HttpApplication Application = (HttpApplication)source
wangzhely 2010-12-17
  • 打赏
  • 举报
回复
如果你选择使用HttpModule
你可以考虑这样的方案,因为使用HttpModule不会对请求的后缀进行配置识别
配置识别指的是像 HttpHandler 在web.config中具有path属性 可以对请求的类型进行识别和过滤

所以,你可以通过表配置的方式来实现这样的功能。
权限验证不只包含是否已经登录,还包含了每一个path是否具有访问权限,还有可能包含了权限的范围大小
如果这样考虑,可以把每一个path作为配置表中的一条记录,表中的path仅仅是操作,像.css .ico这样的不需要放入表中

这样我们就得到了一张操作表,表中包含了我们操作所使用的每一个path,这里你可以理解为URL

下面就简单了
在应用程序开始时 就将操作表放入缓存

在权限验证的中
string path = context.Request.FilePath;

if(service.GetActionByPath(path) != null)
{
//加入验证方法
}

不仅是这里,比如记录操作日志,记录错误日志,都可以读取这张操作表,还可以进行配置, 比如加入字段 isLog

另外,异步调用会使applacation.session,applacation.cache丢失 所以建议使用键值形式对这些数据进行保存,当然,这些类前提是必须可以被序列化
ybbtuubj 2009-12-22
  • 打赏
  • 举报
回复
我发现很多人都用httpmodule实现权限的,都没出过问题啊?我和楼主出了同样问题,检查了下确实是由于请求包括了.css这样的文件,造成了session不可用。我的解决方法是过滤掉了.css这样文件的请求,不知道其他人是如何解决的。(ps:这帖子沉了)
zperson 2009-11-13
  • 打赏
  • 举报
回复
public class MyModule: IHttpModule , IRequiresSessionState

必须实现IRequiresSessionState接口,才能取得session
zperson 2009-11-13
  • 打赏
  • 举报
回复
public class MyModule: IHttpModule , IRequiresSessionState

必须实现IRequiresSessionState接,才能取得session
executemylove 2007-02-26
  • 打赏
  • 举报
回复
楼主怎么不出来说一下
hertcloud 2007-02-26
  • 打赏
  • 举报
回复
那里的问题?
webdiyer 2007-02-26
  • 打赏
  • 举报
回复
应该是SessionState就是在AcquireRequestState事件中进行初始化的,所以你在这里个事件自理程序中还无法访问到Session对象.
binny0532 2007-02-26
  • 打赏
  • 举报
回复
好了 自己解决了
webdiyer 2007-02-26
  • 打赏
  • 举报
回复
不关HttpModule的事,而是事件引发顺序的问题,在AcquireRequestState事件引发时,Session对象还没有被创建,所以会有你的问题,看看这篇文章及其解决方案:

http://www.dotnetjunkies.com/Article/543AE98B-FD00-4064-B128-AB76E7BC34B3.dcik
binny0532 2007-02-26
  • 打赏
  • 举报
回复
帮帮忙啊啊。。。。
binny0532 2007-02-26
  • 打赏
  • 举报
回复
跟踪发现HttpContext.Current.Session为Null
binny0532 2007-02-26
  • 打赏
  • 举报
回复
to:cpp2017(慕白兄)
System.Web.HttpContext.Current.Session["UserName"]这个方法我已经试过了。也是不对
cpp2017 2007-02-26
  • 打赏
  • 举报
回复
这样写看看: string userName = Convert.ToString(System.Web.HttpContext.Current.Session["UserName"]);
binny0532 2007-02-26
  • 打赏
  • 举报
回复
我发现一个很奇怪的问题。
对css文件的请求也会进入context_AcquireRequestState
那样的话if (application.Session["UserName"] == null)这句话都会出错
cpp2017 2007-02-26
  • 打赏
  • 举报
回复
我用过是可以的.
binny0532 2007-02-26
  • 打赏
  • 举报
回复
用的是2。0
application.Context.Sesseion["UserName"] 和 application.Session["UserName"]
都用过,一样
加载更多回复(17)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧