【问题标题】:ASP.NET MVC Session Variables LostASP.NET MVC 会话变量丢失
【发布时间】:2015-07-17 14:25:24
【问题描述】:

我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的——在我们的生产环境中,这工作正常,在我们的测试环境中,我们丢失了会话变量。这以前在我们的测试环境中使用相同的代码工作,这让我相信这是一些不同的 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 设置:模式:使用 Cookies
  • 名称:ASP.NET_SessionId
  • 超时:20 分钟
  • 未选中重新生成过期会话 ID
  • 已选中使用主机身份进行模拟

【问题讨论】:

  • 这是针对集群/网络场运行的吗?回调是否有可能转到第一次调用之外的实例?
  • 使用 IIS 管理器,比较测试和生产环境之间的“会话状态”设置。那里可能有线索。
  • 我会对“会话”进行全局搜索,并确保它不会在应用程序的任何地方以编程方式清除或关闭。
  • 另外,应用程序池可以在两次调用之间循环吗?你可以在Application_Start中添加一条日志语句,看看是不是这样。
  • 您可以检查应用程序池上的“空闲超时”设置(在 IIS 管理器--应用程序池--高级设置中)。如果 test 和 prod 相同,请比较所有其他池设置。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2021-03-03
      • 2011-04-15
      • 2011-12-05
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多