我在.net4上有一个MVC3应用程序,它的会话在dev环境中工作,但不在生产环境中工作。
在制作中我记录了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是相同的。
答案 0 :(得分:15)
链接: 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
中定义。
现在,我想知道这是否是通常的事情。这肯定不是这样,因为它看起来很粗糙......
链接: 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;
}
}
}
答案 1 :(得分:3)
另一个可能的原因/解决方案是,如果域名具有下划线,IE不会保存cookie(因为严格来说,域名不能有下划线,因此您可能只会在开发中遇到此问题),例如: http://my_dev_server/DoesntWork
。 Chrome或Firefox应该适用于这种情况,如果您更改了您正在使用的域名,则不会解决下划线问题。
参考:
答案 2 :(得分:0)
对我来说,我发现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;
}
}
Microsoft在这里拥有的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.Current
和Session
现在已经存在,所以我甚至可以简化为:
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"];