ASP.NET MVC会话变量丢失

时间:2015-07-17 14:25:24

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

我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的 - 在我们的生产环境中,这很好,在我们的测试环境中,我们丢失了会话变量。以前曾经在我们的测试环境中使用相同的代码,这使我相信它的某些IIS或服务器设置有所不同。

这是对SFDC的集成,我在页面加载时添加了一些会话变量。然后,在用户完成登录流程后,SFDC回调并尝试读取这些会话变量。

以下是我如何设置会话变量:

Session.Add("tenantID", tenantId);
Session.Add("clientID", tenantInfo.SalesforceKey);
Session.Add("session", session);
Session.Add("clientSecret", tenantInfo.SalesforceSecret);
Session.Add("userEmail", user.Email);
Logger.Debug("Set session tenantID to " + int)Session["tenantID"]).ToString()); // This outputs the proper value.

但是,在同一个控制器的回调函数中,运行此代码时,所有会话变量都为空。

public ViewResult Callback(string code)
{

    Logger.Debug("Entering callback, code:" + code);
    Logger.Debug("Session vars:");

    if (Session["tenantID"] == null) // This is true
        Logger.Debug("tenantID: null"); 

    if (Session["clientID"] == null) // This is true
        Logger.Debug("clientID: null");

    if (Session["session"] == null) // This is true
        Logger.Debug("session: null");

    if (Session["clientSecret"] == null) // This is true
        Logger.Debug("clientSecret: null");

    // etc...

}

最初我认为会话正在结束,所以我在Global.asax中添加了以下内容。在回调执行完毕之后,没有会话结束日志行输出。

    void Session_End(Object sender, EventArgs E)
    {
        // Clean up session resources
        Logger.Info("session ended for " + (string)Session["userEmail"]);
    }

    void Session_Start(Object sender, EventArgs E)
    {
        // Clean up session resources
        Logger.Info("session started.");
    }

可能对此有所帮助的一些线索: - 我运行了一个小提琴手来捕获初始页面加载和回调,两个请求中的ASP.NET会话ID相同:

 (Page Load): Cookie: ASP.NET_SessionId=j1ggxuamkc2rk3q03z2vwye1

 (Callback):  Cookie: ASP.NET_SessionId=j1ggxuamkc2rk3q03z2vwye1
  • 以前,我们的记录器语句会输出到一个文件,但是,我们使用log4net,现在它似乎正在创建第二个文件来输出回调记录器语句。在生产中,我们只看到一个文件。如果我从第一个文件中的Global.asax代码获得会话结束日志(与页面加载相关联),我可以读取会话值。如果我在第二个日志文件中获得会话结束日志(与回调相关联),则会话值再次为空。

  • 我的web.config没有包含任何sessionState元素,并且在生产和测试中设置相同。

感谢您的帮助。

以下是该Web应用程序的IIS会话状态设置:

  • 会话状态模式设置:设置为处理中
  • Cookie设置:模式:使用Cookie
  • 名称:ASP.NET_SessionId
  • 超时:20分钟
  • 未选中重新生成过期的会话ID
  • 检查使用主机标识进行模拟

2 个答案:

答案 0 :(得分:2)

比较测试和prod环境之间的应用程序池的设置。

答案 1 :(得分:0)

我也有类似的情况,我们的应用程序在服务器中运行良好,而不是在本地由于会话变量null。如果您在MVC中实现sessionfilter,最好在Visual Studio中运行IIS Express中的应用程序而不是Visual Studio开发服务器。这解决了我们的会话丢失问题。