SessionManager和Session随机为null

时间:2013-12-06 14:27:06

标签: c# asp.net session

我几个月来一直面临着这个问题,我几乎已经阅读了所有关于这个问题并实现了大多数解决方案,但仍然没有任何改变。我不知道我在哪里弄错了。

我正在使用自定义SessionManager类在我的ASP.net CMS网站的管理面板中轻松获取/设置值Session。当用户登录时,我将用户数据存储到Session,然后在Admin.master页面中读取以检查用户是否已登录。在不同的服务器上以及localhost上,SessionManager.CurrentUser值随机为null登录后,有时是2分钟,有时是20分钟,页面是否空闲。我的所有网站都有同样的问题。

我的SessionManager.cs是

public class SessionManager
{
    public SessionManager() { }

    public static User CurrentUser
    {
        get { return (User)HttpContext.Current.Session["crntUsr"]; }
        set { HttpContext.Current.Session["crntUsr"] = value; }
    }

    public static string CurrentAdminLanguage
    {
        get
        {
            if (HttpContext.Current.Session["crntLang"] == null) HttpContext.Current.Session["crntLang"] = SiteSettings.DefaultLanguage;
            return HttpContext.Current.Session["crntLang"].ToString();
        }
        set
        {
            HttpContext.Current.Session["crntLang"] = value;
        }
    }
}

注意:用户类是[Serializable]

在Admin.master Page_Load

if (SessionManager.CurrentUser == null) Response.Redirect("../login");

在web.config中

    <system.web>
         <sessionState mode="InProc" customProvider="DefaultSessionProvider" cookieless="UseCookies" regenerateExpiredSessionId="true" timeout="60"/>
         <machineKey validationKey="CC0...F80" decryptionKey="8BF...1B5" validation="SHA1" decryption="AES"/>
         <authentication mode="Forms">
             <forms loginUrl="~/login" timeout="60" slidingExpiration="true" cookieless="UseCookies" />
         </authentication>

    <system.webServer>
        <modules>
            <remove name="Session"/>
            <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
        </modules>

我真的没有更多想法来解决这个问题。请帮忙:(

3 个答案:

答案 0 :(得分:0)

您是否检查了应用程序池回收超时?这是会议“消失”之前的一个常见问题。签入IIS

答案 1 :(得分:0)

如果您遇到问题,可以设置SQL Server来处理会话,如果AppPool被回收,或者重新启动服务器,会继续使用SQL Server。

有关详细信息:http://support.microsoft.com/kb/317604

答案 2 :(得分:0)

这是一个示例web.config代码。我不喜欢那里的regenerateExpiredSessionId,并且让会话超时小于表单超时也是一个好习惯。我的建议是如何仔细检查您的会话管理器代码,以确保您不会以某种方式重置它。我可以想到你可以做的两件事: 1.创建一个测试页以检查会话何时为空,并查看是否可以设置会话变量。尝试按下一个按钮(或ajax请求)并设置一个会话变量,使会话每1分钟左右保持活动状态,看它是否会再次过期,即使你保持活着状态。如果您不使用会话,它将过期。 2.做某种伐木。每次设置会话变量时,都要对已设置的变量执行DB日志。您可以使用1中的测试页面来查看您在当前用户的会话中确切设置了什么。

<authentication mode="Forms">
  <forms name="Web-site.ASPXAUTH" loginUrl="~/admin/login.aspx" protection="All" timeout="60" path="/" requireSSL="false" slidingExpiration="true" cookieless="UseDeviceProfile" domain="" enableCrossAppRedirects="false" />
</authentication>
<sessionState timeout="60" mode="InProc" />
<membership defaultProvider="WebSiteMembershipProvider">
  <providers>
    <clear />
    <add name="WebSiteMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnStr" applicationName="web-site" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" requiresQuestionAndAnswer="false" enablePasswordReset="true" enablePasswordRetrieval="false" passwordFormat="Hashed" requiresUniqueEmail="false" />
  </providers>
</membership>
<roleManager defaultProvider="WebSiteRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="Web-Site.ASPXROLES" cookieTimeout="60" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All" createPersistentCookie="false" maxCachedResults="25">
  <providers>
    <clear />
    <add name="WebSiteRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnStr" applicationName="web-site" />
  </providers>
</roleManager>