ASP.NET MVC - 会话为nullASP.NET MVC - 会话为null(ASP.N

2019-05-14 06:22发布

我有,它会在开发环境工作.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是一样的。

Answer 1:

解决方案1:

链接: 路由请求时HttpContext.Current.Session为null

得到它了。 很愚蠢,其实。 它的工作后我删除和添加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空项目

sessionKey可能会改变,你可能只需要做到:

HttpContext.Current.Session["CurrentUser"]

或会话可能过期,检查超时:

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

或者你也可以从别的地方设置会话值,通常我通过一个属性来控制访问会话/上下文对象

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;
  }
 }
} 


Answer 2:

另一个可能的原因/解决方案是,IE浏览器不会保存cookies,如果域名有下划线(因为严格地说域名不能有下划线,所以你可能只遇到这样的发展),例如http://my_dev_server/DoesntWork 。 Chrome或Firefox应该在这种情况下工作,如果你改变了域名您使用的是没有下划线问题就迎刃而解了。

参考:

  • http://blog.smartbear.com/software-quality/internet-explorer-eats-cookies-with-underscores-in-the-hostname/
  • http://social.msdn.microsoft.com/Forums/ie/en-US/8e876e9e-b223-4f84-a5d1-1eda2c2bbdf4/ie7-cookie-issue-when-domain-name-has-underscore-character-in-它?论坛= iewebdevelopment


Answer 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();

如果这一直是对象,你干脆把对象的类型代替<string>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"];


文章来源: ASP.NET MVC - Session is null