我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的 - 在我们的生产环境中,这很好,在我们的测试环境中,我们丢失了会话变量。以前曾经在我们的测试环境中使用相同的代码,这使我相信它的某些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会话状态设置:
答案 0 :(得分:2)
比较测试和prod环境之间的应用程序池的设置。
答案 1 :(得分:0)
我也有类似的情况,我们的应用程序在服务器中运行良好,而不是在本地由于会话变量null。如果您在MVC中实现sessionfilter,最好在Visual Studio中运行IIS Express中的应用程序而不是Visual Studio开发服务器。这解决了我们的会话丢失问题。