ASP.NET MVC会话变量丢失

ASP.NET MVC会话变量丢失,asp.net,asp.net-mvc,session,iis,Asp.net,Asp.net Mvc,Session,Iis,我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的-在我们的生产环境中,这很好,在我们的测试环境中,我们丢失了会话变量。这以前在我们的测试环境中使用过相同的代码,这让我相信是某些IIS或服务器设置不同 这是对SFDC的集成,我在页面加载中添加了一些会话变量。然后,在用户通过登录流之后,SFDC会回调,我会尝试读取这些会话变量 下面是我如何设置会话变量的: Session.Add("tenantID", tenantId); Session.Add("clientID", tenantIn

我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的-在我们的生产环境中,这很好,在我们的测试环境中,我们丢失了会话变量。这以前在我们的测试环境中使用过相同的代码,这让我相信是某些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.
但是,在同一控制器中的回调函数中,当运行此代码时,所有会话变量都为null

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.");
    }
以下是一些可能有帮助的线索: -我运行了一个fiddler来捕获初始页面加载和回调,两个请求中的ASP.NET会话ID都是相同的:

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

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

  • My web.config没有包含任何sessionState元素,在生产和测试中设置为相同

谢谢你的帮助

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

  • 会话状态模式设置:设置为进程中
  • Cookie设置:模式:使用Cookie
  • 名称:ASP.NET_SessionId
  • 暂停时间:20分钟
  • 未选中“重新生成过期会话ID”
  • 选中“为模拟使用宿主标识”

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

我也遇到过类似的情况,即由于会话变量null,我们的应用程序在服务器上运行良好,而不是在本地运行。如果要在MVC中实现sessionfilter,最好在VisualStudio中的IIS Express中运行应用程序,而不是在VisualStudio development server中运行。这就解决了会话丢失的问题。

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