Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SessionManager和会话随机为空_C#_Asp.net_Session - Fatal编程技术网

C# SessionManager和会话随机为空

C# SessionManager和会话随机为空,c#,asp.net,session,C#,Asp.net,Session,我已经面对这个问题好几个月了,我已经阅读了几乎所有关于这个问题的资料,并实施了大多数解决方案,但仍然没有任何改变。我不知道我在哪里犯了错误 我正在使用一个自定义的SessionManager类在我的ASP.net CMS网站的管理面板中轻松地获取/设置Session的值。当用户登录时,我将用户数据存储到会话中,然后读取Admin.master页以检查用户是否登录。在不同的服务器和本地主机上,SessionManager.CurrentUser值在随机时间为空,有时在登录后2分钟,有时在登录后20

我已经面对这个问题好几个月了,我已经阅读了几乎所有关于这个问题的资料,并实施了大多数解决方案,但仍然没有任何改变。我不知道我在哪里犯了错误

我正在使用一个自定义的
SessionManager
类在我的ASP.net CMS网站的管理面板中轻松地获取/设置
Session
的值。当用户登录时,我将用户数据存储到
会话中
,然后读取Admin.master页以检查用户是否登录。在不同的服务器和本地主机上,
SessionManager.CurrentUser
值在随机时间为空,有时在登录后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;
        }
    }
}
注意:用户类是[可序列化的]

在Admin.master页中加载

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>


我真的没有办法解决这个问题了。请提供帮助:(

是否检查了应用程序池回收超时?这是会话在预期时间之前“消失”的常见问题。如果出现问题,请签入IIS

如果您有问题,可以设置SQL Server来处理会话,如果应用程序池回收或服务器重新启动,该会话将持续存在


有关详细信息:

这里是一个示例web.config代码。我不喜欢其中的regenerateExpiredSessionId,而且将会话超时设置为小于表单超时也是一个很好的做法。我的建议是仔细检查会话管理器代码,以便确保不会以某种方式重置它。我认为f你可以做两件事: 1.创建一个测试页面,检查会话是否为空,并查看是否可以设置会话变量。尝试单击按钮(或ajax请求)并设置一个会话变量,使会话每隔1分钟左右保持活动状态,以查看会话是否再次过期,即使您保持活动状态。如果您不使用会话,它将过期。2.执行某种日志记录。每次设置会话变量时,都要对已设置的变量进行DB日志记录。您可以使用1中的测试页面查看您已设置的具体内容n当前用户的会话

<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>


这太奇怪了,InProc不能正常工作,如果我能解决这个问题,一切都会好起来的。我认为InProc应该足以满足需要。我已经为几个项目实施了CMS,所以你的建议将是我最后的机会。无论如何,谢谢。这个问题可能有很多原因。请为AppPool r阅读ecycling:我在localhost上有时会遇到这个问题。ASP.Net Development Server是否也有应用程序回收超时?可能我在localhost上遇到这个问题是因为内存或进程回收。我再次检查了它。AppPool timeout、Forms timeout和sessionstate timeout都是相同的值60。现在,我似乎没有pr有问题,但仍然不确定它是否正常。对于我的一个网站,我已经联系了托管公司,他们说不可能为每个网站更改此回收超时,因此我应该购买VDS服务器。是否可以为每个网站配置应用程序池回收超时?如果你在托管下,你几乎没有什么资源机会。任何可能导致应用程序池回收的东西(内部或外部)都会破坏你的会话。所以你应该转向另一种类型的会话管理(例如在DB上)正如在其他回答中所建议的那样。除非我有一台服务器,否则我将尝试转移到SqlServer模式。我想知道有多大的应用程序管理这么多的会话?我认为WebItemMembershipProvider是自定义的提供程序,对吗?记录会话是一个好主意,我已经尝试过了,但没有看到任何异常。我想我将转移到SqlServer模式会话保修期。我不知道在这种模式下我会遇到什么样的问题:(在这里尝试我的解决方案: