C#静态Auth_Token属性递归循环问题:无额外私有字段实现懒加载
问题修复方案
原代码递归问题根源
原代码中Auth_Token 属性手动实现了get/set访问器后,编译器不会为其自动生成隐藏的后备存储字段,所有在访问器内部对 Auth_Token 的读写操作都会直接触发当前属性的访问逻辑,形成无限递归:
- 读取属性进入get块后,判断
Auth_Token != null时会再次触发get调用 - set块内对
Auth_Token的赋值操作会再次触发set逻辑,循环往复
实现方案(不新增额外私有字段)
复用项目中已初始化的静态HttpClient实例的默认请求头字典作为Token的存储载体,完全不需要新增独立的私有字段存储Token值,同时移除所有自引用逻辑解决递归问题,逻辑匹配“Token为null时自动调用登录方法获取有效值”的要求。
修复后的完整代码
static TestInitialization() { client = new HttpClient(); client.BaseAddress = new Uri(URL_BASE_ADRESS); // 移除原代码中提前添加auth-key头的逻辑,避免静态构造阶段写入空值 } private const String path = @"f:\specialproject\authdata.txt"; internal static readonly String Login = File.ReadLines(path).First(); //该文件第一行必须存储登录账号 internal static readonly String Password = File.ReadLines(path).Last();//该文件第二行必须存储登录密码 internal static String Auth_Token { get { // 直接从HttpClient请求头读取缓存的Token,不做属性自引用 if (client.DefaultRequestHeaders.TryGetValues("auth-key", out var headers) && headers.FirstOrDefault() is { Length: > 0 } cachedToken) { return cachedToken; } // 无有效缓存时直接调用登录方法获取Token return LoginAndGetToken(); } set { // 直接更新请求头中的Token值,不做属性自引用赋值 client.DefaultRequestHeaders.Remove("auth-key"); client.DefaultRequestHeaders.Add("auth-key", value); } } internal static String LoginAndGetToken() { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{URL_BASE_ADRESS}/console/home/login"); request.Content = new StringContent( "{\"login\":\"" + TestInitialization.Login + "\",\"password\":\"" + TestInitialization.Password + "\"}", Encoding.UTF8, "application/json"); // 从登录响应中提取有效Token var responseToken = client.SendAsync(request) .GetAwaiter() .GetResult() .Headers .GetValues("auth-key") .First(); // 触发set逻辑更新缓存的Token值,该操作直接操作请求头,不会触发递归 Auth_Token = responseToken; return responseToken; }
逻辑验证
- 第一次访问
Auth_Token时,get块检测到请求头中没有缓存的有效Token,自动调用LoginAndGetToken完成登录并将结果写入请求头缓存,全程无递归 - 后续访问
Auth_Token时,直接从请求头返回已缓存的有效Token,不会重复触发登录请求 - 主动给
Auth_Token赋值时,直接更新请求头中的缓存值,无自引用递归 - 全程没有新增任何独立的私有字段,完全复用已有的
client实例的内部存储能力
内容的提问来源于stack exchange,提问作者Artnox ips
相关产品推荐
相关产品推荐

