【发布时间】: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