c# - 静态变量在负载平衡环境中不起作用。

标签 c# asp.net static sharepoint-2010 forms-authentication

我已经实现了多设备注销功能。如果有人从一台设备更改密码,而不是同一用户登录其他设备,则他应该通过单击任何其他页面自动注销。

下面是我实现它的方法。 第 1 步:我创建了下面的静态类来实现它。

enter code herepublic static class SessionStateStoreProvider
{       
    public static List<SessionStateList> sessionStateProviderList;
    static SessionStateStoreProvider()
    {
        sessionStateProviderList = new List<SessionStateList>();
    }        
}


public  class SessionStateList
{
    public  string UserName { get; set; }
    public  string GUID { get; set; }

}

第 2 步:在每次成功登录时,我将其存储在 SessionStateStoreProvider 类中。

            Guid sessionIdentifier = Guid.NewGuid();                
            SessionStateList objSessionState = new SessionStateList();
            objSessionState.GUID = Convert.ToString(sessionIdentifier);
            objSessionState.UserName = userName;
            SessionStateStoreProvider.sessionStateProviderList.Add(objSessionState);                 
            Session["SessionIdentifier"] = Convert.ToString(sessionIdentifier);

第 3 步:成功更改密码后,我将删除与用户关联的所有 Guid。

        SessionStateStoreProvider.sessionStateProviderList.RemoveAll(x => x.UserName == userName);

第 4 步:我创建了一个 Http 模块,用于检查用户请求是否有效。

string sessionIdentifier = Convert.ToString(HttpContext.Current.Session["SessionIdentifier"]);
       string userName = HttpContext.Current.User.Identity.Name;
       List<SessionStateList> stateList = SessionStateStoreProvider.sessionStateProviderList;
       bool isValidSession = false; isValidSession = stateList.Any(cus => cus.GUID == sessionIdentifier);
       if (isValidSession == false)
       {
   FederatedAuthentication.SessionAuthenticationModule.SignOut();
       }

这在我的测试中工作正常 添加到字典,因为只有一台服务器处理所有请求。 但它在我的生产环境中不起作用,因为有 3 个不同的 WFE 处理 Web 请求。 从我的日志中,我发现每个登录请求都由不同的 WFE 处理。 我同时登录了 4 个不同的浏览器,但 SessionStateProviderList 只记录了一个事件 session 。

 int numberOfActiveSession = 0;
 numberOfActiveSession = Convert.ToInt32(SessionStateStoreProvider.sessionStateProviderList.FindAll(x => x.UserName == userName).Count); 

我该如何处理这种情况?我应该遵循哪种方法?缓存是解决这个问题的方法吗? 任何帮助将不胜感激。

最佳答案

静态变量在一个池内和池的一个进程上是相同的。

要在进程之间共享数据,您需要一个公共(public)数据库文件,或共享公共(public)内存。它们都必须位于您从所有池/计算机/进程访问的中央计算机上。

redis是用于此的开源内存数据结构存储。此外,MS SQL 2016 还宣传使用内存中数据进行快速访问。

更多关于静态变量的阅读: Lifetime of ASP.NET Static Variable

关于c# - 静态变量在负载平衡环境中不起作用。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581186/

相关文章:

c# - asp.net LinqDataSource 使用 join 查询多个表

c# - 如何从 ASP.NET 事件调用 C# 函数?

c# - 同一应用程序中的多个静态变量范围?

c# - 在 C# 中是否有可能知道谁调用了静态属性/访问器?

c# - 光子库离线模式问题

c# - 如何将控件添加到集合的开头?

c# - 如何获取当前登录用户的广告显示名称

html - 在运行时动态添加 div 和图像 - vb

php - 在函数内重新声明相同的静态变量

c# - 尝试在 gridview 标题中的文本框中设置值