ASP.NET MVC会话变量丢失
我的会话变量在页面之间丢失。有趣的是,这似乎是特定于环境的-在我们的生产环境中,这很好,在我们的测试环境中,我们丢失了会话变量。这以前在我们的测试环境中使用过相同的代码,这让我相信是某些IIS或服务器设置不同 这是对SFDC的集成,我在页面加载中添加了一些会话变量。然后,在用户通过登录流之后,SFDC会回调,我会尝试读取这些会话变量 下面是我如何设置会话变量的: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
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元素,在生产和测试中设置为相同
- 会话状态模式设置:设置为进程中
- Cookie设置:模式:使用Cookie
- 名称:ASP.NET_SessionId
- 暂停时间:20分钟
- 未选中“重新生成过期会话ID”
- 选中“为模拟使用宿主标识”