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? 请帮忙,多谢了。。

解决方案 »

  1.   

    using System;
    using System.Web; 
    namespace MyModule
    {
    public class MyModule : IHttpModule 
    {
    public void Init(HttpApplication application) 

    application. AcquireRequestState += (new 
    EventHandler(this.Application_AcquireRequestState));
    }
    private void Application_AcquireRequestState (Object source, 
    EventArgs e) 
    {
    HttpApplication Application = (HttpApplication)source;
    User user=Application.Context.Sesseion["User"]  //获取User
    string url=Application.Context.Request.Path; 
    //获取客户访问的页面
    Module module= //根据url得到所在的模块
    If(!RightChecker.HasRight(user,module))
    Application.Context.Server.Transfer("ErrorPage.aspx"); 
    //如果没有权限,引导到错误处理的页面
    }
    public void Dispose() 
    {
    }
    }
    }
    //--这个应该有点帮助吧
      

  2.   

    to:hertcloud(·£孙子兵法£·) 
    不行,我的代码就是这个
      

  3.   

    用前要先判断一下,是否为null,因为第一次运行,肯定是null的,
    第二次如果有值了就可以取到了.
      

  4.   

    to:cpp2017(慕白兄)
    我判断了if (application.Session["UserName"] == null)
          return;
    string userName = Convert.ToString(application.Session["UserName"]);这样还是不行,提示错误还是会话状态在此上下文中不可用
      

  5.   

    顺便说一下。我的session赋值是这样的
    HttpContext.Current.Session[sessionName] = sessionValue;
      

  6.   

    application.Session["UserName"]TOapplication.Context.Sesseion["UserName"]  
    呢.1.1 2.0?
      

  7.   

    用的是2。0
    application.Context.Sesseion["UserName"]  和 application.Session["UserName"]
    都用过,一样
      

  8.   

    我发现一个很奇怪的问题。
    对css文件的请求也会进入context_AcquireRequestState
    那样的话if (application.Session["UserName"] == null)这句话都会出错
      

  9.   

    这样写看看:
     string userName = Convert.ToString(System.Web.HttpContext.Current.Session["UserName"]);
      

  10.   

    to:cpp2017(慕白兄)
    System.Web.HttpContext.Current.Session["UserName"]这个方法我已经试过了。也是不对
      

  11.   

    跟踪发现HttpContext.Current.Session为Null
      

  12.   

    不关HttpModule的事,而是事件引发顺序的问题,在AcquireRequestState事件引发时,Session对象还没有被创建,所以会有你的问题,看看这篇文章及其解决方案:http://www.dotnetjunkies.com/Article/543AE98B-FD00-4064-B128-AB76E7BC34B3.dcik
      

  13.   

    应该是SessionState就是在AcquireRequestState事件中进行初始化的,所以你在这里个事件自理程序中还无法访问到Session对象.
      

  14.   

    我来说一下我的研究结果:
    首先,httpmodule是对所有的请求都相应,所以有一些非aspx的请求也进入了。比如说xx.css
    这样的话就不存在session了,再去取session的值肯定会出错。其次,我把以前做java使用的那种filter方式配置的action,url不直接写xx.aspx,而用XX/XXX/XX这种模块方式,所以也会取不到sessioin。我对dotnet的httpmodule不是很熟,如果高手有更好的解释或者方法,请说说
    明天我再结帖,谢谢大家了
      

  15.   

    session生存期的问题了,你可以注意到在debug模式下session对象是null,因为在init时没有生成session对象.
      

  16.   

    必须继承自IRequiresSessionState这个标记接口。任何需要读写Session的类都如此,无论你是IHttpModule还是IHttpHandler甚至是别的自定义类。
      

  17.   

    先判断 application.Context.Session != null
      

  18.   

    参考,请到MSDN查一下IRequiresSessionState的说明。public class _Common_ClickCount : IHttpHandler, IRequiresSessionState
        {
            string _message = "//更新成功。";        public void ProcessRequest(HttpContext context)
            {
                string checkString = context.Request.QueryString["cs"];
                if ((context.Session["CheckString"] != null) && (checkString == context.Session["CheckString"].ToString()))
                {
                    this.ClickCountAddOne(Convert.ToInt32(context.Request.QueryString["id"]), context.Request.QueryString["table"], ref _message);
                    context.Session["CheckString"] = string.Empty;
                }
                else
                {
                    _message = "//请求错误。";
                }
                context.Response.ContentType = "text/plain";
                context.Response.Write(_message);
            }        public bool IsReusable
            {
                get
                {
                    return true;
                }
            }
    }
      

  19.   

    public class MyModule: IHttpModule , IRequiresSessionState
       
    必须实现IRequiresSessionState接,才能取得session
      

  20.   

    public class MyModule: IHttpModule , IRequiresSessionState
       
    必须实现IRequiresSessionState接口,才能取得session
      

  21.   

    我发现很多人都用httpmodule实现权限的,都没出过问题啊?我和楼主出了同样问题,检查了下确实是由于请求包括了.css这样的文件,造成了session不可用。我的解决方法是过滤掉了.css这样文件的请求,不知道其他人是如何解决的。(ps:这帖子沉了)
      

  22.   

    如果你选择使用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丢失 所以建议使用键值形式对这些数据进行保存,当然,这些类前提是必须可以被序列化
      

  23.   

    你在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
      

  24.   

    看看帖子 HttpModule中真的不能读写Session吗?