【问题标题】:ASP.NET MVC - Session is nullASP.NET MVC - 会话为空
【发布时间】:2012-05-24 16:26:46
【问题描述】:

我在 .net4 上有一个 MVC3 应用程序,它的会话在开发环境中工作,但不在生产环境中。
在生产中,我记录了 sessionID,并且在我从会话中设置和获取的那一刻它是相同的。

当我尝试获取会话时,我得到了Null Exception

这是我访问会话的方式:

public static class HandlersHttpStorage
{
    public static string TestSession
    {
        get
        {
            return HttpContext.Current.Session["time"];//This is null
        }
        set
        {
            HttpContext.Current.Session.Add("time", value);//DateTime.Now.ToString()
        }
    }
}

让我担心的是生产中的行为与开发中的行为不同,即使 web.config 相同。

【问题讨论】:

  • 使用 fiddler 并查看您的会话 ID。浏览器是否保留它(它是否会在下一次请求时将其发送回服务器)?是否每次都向客户发送新的?您是否在默认值之外指定了一个单独的 cookie 域(这可以解释在一个环境而不是另一个环境下工作)
  • @AdamTuliper - 你能解释一下“单独的 cookie 域”吗?谢谢
  • 看看你的 web.config 有没有类似
  • 最终在这里找到了我对这个问题的答案:stackoverflow.com/a/1212451/578859

标签: asp.net asp.net-mvc-3 session


【解决方案1】:

解决方案 1:

链接: HttpContext.Current.Session is null when routing requests

知道了。相当愚蠢,实际上。在我像这样删除并添加 SessionStateModule 后它起作用了:

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

仅仅添加它是行不通的,因为“会话”应该已经在 machine.config 中定义了。

现在,我想知道这是否是通常的做法。看起来肯定不是这样,因为它看起来很粗糙......

解决方案 2:

链接: HttpContext.Current.Session null item

sessionKey 可能会发生变化,您可能只需要这样做:

HttpContext.Current.Session["CurrentUser"]

或者会话可能即将到期,请检查超时:

http://msdn.microsoft.com/en-us/library/h6bb9cz9(VS.71).aspx

或者您可能正在从其他地方设置会话值,通常我通过一个属性控制对 Session/Context 对象的访问

static readonly string SESSION_CurrentUser = "CurrentUser";

public static SiteUser Create() {     
 SiteUser.Current = new SiteUser();      
 return SiteUser.Current;
}

public static SiteUser Current {     
 get {         
  if (HttpContext.Current.Session == null || HttpContext.Current.Session[SESSION_CurrentUser] == null) {             
   throw new SiteUserAutorizationExeption();         
  }          
  return HttpContext.Current.Session[SESSION_CurrentUser] as SiteUser;     
 } 
 set {
  if (!HttpContext.Current.Session == null) {
   HttpContext.Current.Session[SESSION_CurrentUser] = value;
  }
 }
} 

【讨论】:

  • 谢谢你,我已经尝试了你在这里的所有建议,但仍然没有。
【解决方案2】:

另一个可能的原因/解决方案是,如果域名有下划线,IE 不会保存 cookie(因为严格来说域名不能有下划线,所以你可能只会在开发中遇到这种情况),例如http://my_dev_server/DoesntWork。 Chrome 或 Firefox 应该在这种情况下工作,如果您更改您正在使用的域名以不解决下划线问题。

参考:

【讨论】:

    【解决方案3】:

    对我来说,我发现HttpContext.Current 为空,所以我创建了它:

    System.Web.HttpContext c = System.Web.HttpContext.Current; 
    

    然后我将它传递到我的另一个类中的函数中,如下所示:

    string myString = "Something to save";
    SessionExtensions.SetDataToSession<string>(c, "MyKey1", myString);
    

    我实际上希望我的函数成为Session 的真正扩展方法,如下所示,但我发现this HttpSessionStateBase session 为空,当我尝试添加任何内容时,它会给出NullReferenceException Session 使用它。所以这个:

    public static class SessionExtensions 
    { 
       /// <summary> 
       /// Get value. 
       /// </summary> 
       /// <typeparam name="T"></typeparam> 
       /// <param name="session"></param> 
       /// <param name="key"></param> 
       /// <returns></returns> 
       public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) 
       { 
           return (T)session[key]; 
       } 
       /// <summary> 
       /// Set value. 
       /// </summary> 
       /// <typeparam name="T"></typeparam> 
       /// <param name="session"></param> 
       /// <param name="key"></param> 
       /// <param name="value"></param> 
       public static void SetDataToSession<T>(this HttpSessionStateBase session, string key, object value) 
       { 
           session[key] = value; 
       } 
    } 
    

    微软在这里:https://code.msdn.microsoft.com/How-to-create-and-access-447ada98 变成了这个,而不是:

    public static class SessionExtensions 
    { 
       /// <summary> 
       /// Get value. 
       /// </summary> 
       /// <typeparam name="T"></typeparam> 
       /// <param name="session"></param> 
       /// <param name="key"></param> 
       /// <returns></returns> 
       public static T GetDataFromSession<T>(HttpContext context, string key) 
       { 
            if (context != null && context.Session != null)
            {
                context.Session.Abandon();
            }
    
            return (T)context.Session[key];
       } 
       /// <summary> 
       /// Set value. 
       /// </summary> 
       /// <typeparam name="T"></typeparam> 
       /// <param name="session"></param> 
       /// <param name="key"></param> 
       /// <param name="value"></param> 
       public static void SetDataToSession<T>(HttpContext context, string key, object value) 
       { 
           context.Session[key] = value; 
       } 
    } 
    

    我能够像这样检索我的数据:

    System.Web.HttpContext c = System.Web.HttpContext.Current;
    string myString = SessionExtensions.GetDataFromSession<string>(c, "MyKey1");
    

    当然,既然 HttpContext.CurrentSession 现在存在,我什至可以将其简化为:

     string myString = Session["MyKey1"].ToString();
    

    如果这是对象,您可以将对象的类型替换为 &lt;string&gt; 中的 SetDataToSession() 功能:

    List<string> myStringList = new List<string>();
    myStringList.Add("Something to save");
    SessionExtensions.SetDataToSession<List<string>>(c, "MyKey1", myStringList);
    

    然后检索它:

    System.Web.HttpContext c = System.Web.HttpContext.Current;
    List<string> myStringList = SessionExtensions.GetDataFromSession<List<string>>(c, "MyKey1");
    

    或者简单地说:

    List<string> myStringList = (List<string>)Session["MyKey1"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多