C# 会话变量在Visual Studio和服务器上的行为不同

C# 会话变量在Visual Studio和服务器上的行为不同,c#,asp.net,C#,Asp.net,我希望某段代码在每个会话中只执行一次,因此如果用户在同一会话中导航到包含此代码的页面,我不希望执行此段。代码位于登录后立即调用的默认页面中,用户可以从其他页面导航到此默认页面 我的解决方案: if (Session["MySessionName"] == null && ConditionTwo) //initially MySessionName won't exist so the if condition resolves to true { //Assign Va

我希望某段代码在每个会话中只执行一次,因此如果用户在同一会话中导航到包含此代码的页面,我不希望执行此段。代码位于登录后立即调用的默认页面中,用户可以从其他页面导航到此默认页面

我的解决方案:

if (Session["MySessionName"] == null && ConditionTwo) //initially MySessionName won't exist so the if condition resolves to true
{
    //Assign Value to MySessionName so the if condition resolves to false next time
    Session["MySessionName"] = "MySessionValue";
    //Do Something
}
我的问题是:

这在VisualStudio上运行良好,在部署到测试服务器后,此解决方案似乎并不总是有效。如果我注销并重新登录,则条件
Session[“MySessionName”]==null
返回
false
,代码段将不会执行。但是,如果我关闭浏览器,重新打开并登录,它就可以正常工作。我已经检查了注销是否进行了正确的会话处理,并且确实如此

我也试过,

HttpContext.Current.Session["MySessionName"] = "MySessionValue"; 
//and 
Session.Add("MysessionName", true);

但是结果是一样的。

如果您使用的是表单身份验证,则需要调用
FormsAuthentication.SignOut()

此外,在注销时,您需要调用
Context.Session.about()
来终止当前会话


我还确保在放弃会话之前,始终明确清除会话状态中的任何敏感值或与用户相关的值。

是否希望在每次新会话或每次身份验证中都这样做?因为这些是不同的东西。会话可以在身份验证(登录/注销)之间持续存在。我希望每次身份验证都会发生会话,基本上,每次登录都需要执行一次会话。谢谢大家,您的回答和Jon Adams的评论让我找到了正确的解决方案,我将Session变量添加到身份验证模块中,以便解决我的问题的注销过程放弃它。