gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:22 26 4
gpt4 key购买 nike

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

下面是我实现它的方法。第 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com