none
如何在类中使用Session RRS feed

  • 问题

  • 我使用Jquery的ajax方法进行ajax访问,使用httpHandlers拦截请求到指定类进行处理:

     public void CheckValidateCode(object parm)
        {
          object validatecode = HttpContext.Current.Session["Code"];
          string result = "0";
          if (validatecode != null)
          {
            string[] parms = (string[])parm;
            if (validatecode.ToString() == parms[0])
            {
              result = "1";
            }
          }
          HttpContext.Current.Response.Write(result);
        }

    然而这里的HttpContext.Current.Session为null,抛出错误未将对象引用到实例,

    然后我这样做:

     public class ValidateCode : System.Web.SessionState.IRequiresSessionState    
      {
        public void CheckValidateCode(object parm)
        {
          object validatecode = HttpContext.Current.Session["validateCode"];
          string result = "0";
          if (validatecode != null)
          {
            string[] parms = (string[])parm;
            if (validatecode.ToString() == parms[0])
            {
              result = "1";
            }
          }
          HttpContext.Current.Response.Write(result);
        }
      }

    仍然Session为null。

    后来再这样改:

    public class ValidateCode :System.Web.UI.Page    
      {
        public void CheckValidateCode(object parm)
        {
          object validatecode = HttpContext.Current.Session["validateCode"];
          string result = "0";
          if (validatecode != null)
          {
            string[] parms = (string[])parm;
            if (validatecode.ToString() == parms[0])
            {
              result = "1";
            }
          }
          HttpContext.Current.Response.Write(result);
        }
      }

    仍然为null。请问怎样才能在类中访问Session呢?

    Web.Config配置为:

    <sessionState mode="InProc" timeout="20"></sessionState>

    郭鹏
    2010年6月1日 16:52

答案

全部回复

  • HttpContext.Current.Session就是对的,出现错误是你其他的地方导致的
    【孟子E章】
    2010年6月2日 2:12
    版主
  • 我写了一个简单的测试demo。如下:

    页面:

    <script type="text/javascript">
        function mymethod() {
          $.ajax({
            type: "get",
            url: "AsynchronousRequest.axd",
            cache: false,
            data:
             {
               action: 'Class1/myTest',
               parms:'abc'
             },
            success: function(result) {
              alert(result);
            }
          });
        }
      </script>
    
    <body>
      <form id="form1" runat="server">
        <img src="WebForm1.aspx" />
      <div>
      <input type="button" value="button" onclick="mymethod()" />
      </div>
      </form>
    </body>

    WebForm1.aspx页面:

     protected void Page_Load(object sender, EventArgs e)
        {
          Session["aa"] = "Hello World";
        }

    web.config:

    		<httpHandlers>
    			<remove verb="*" path="*.asmx"/>
    			<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
          <add verb="*" path="AsynchronousRequest.axd" type="SinoSpace.PL.Access.SinoSpaceHandler,ClassLibrary1"/>
        </httpHandlers>
    		<httpModules>
    			<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</httpModules>

    SinoSpaceHandler.cs:

     class SinoSpaceHandler : IHttpHandler
      {
        #region IHttpHandler 成员
    
        public bool IsReusable
        {
          get { return true; }
        }
    
        public void ProcessRequest(HttpContext context)
        {
          try
          {
            string action = string.Empty;
            string parm = string.Empty;
            action = (context.Request["action"] == null)
              ? "" : context.Request["action"];
            parm = (context.Request["parms"] == null)
              ? "" : context.Request["parms"];
            string[] actions = (action != "") ? action.Split('/') : null;
            string[] parms = (parm != "") ? parm.Split(',') : null;
            string _nameSpace = "SinoSpace.PL.Access.Process.";
            string _class = actions[0];
            string _method = actions[1];
            Type type = Type.GetType(_nameSpace + _class);
            object instance = Activator.CreateInstance(type);
            MethodInfo methodInfo = Type.GetType(instance.ToString()).GetMethod(_method);
            methodInfo.Invoke(instance,
              (parms == null) ? null : new object[] { (object)parms });
          }
          catch (Exception e)
          {
          }
        }
    
        #endregion
      }

    Class1.cs:

     public class Class1 : System.Web.SessionState.IRequiresSessionState
      {
        public void myTest(object parm)
        {
          HttpContext.Current.Response.Write(HttpContext.Current.Session["aa"]);
        }
      }
    HttpContext.Current.Session 为null。请帮我看下我哪里有错,谢谢了
    郭鹏
    2010年6月2日 4:02
  • 如果是要在HttpHandler 中读写Session的内容,就要在实现IHttpHandler 的类中同时实现IRequiresSessionState
    【孟子E章】
    2010年6月2日 7:11
    版主
  • class SinoSpaceHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState

    【孟子E章】
    • 已标记为答案 Hugo12345 2010年6月3日 4:26
    2010年6月2日 7:13
    版主