You need to enable JavaScript to run this app. C#静态Auth_Token属性递归循环问题:无额外私有字段实现懒加载
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 19:36:03