v1.0.0-beta.7
Pre-releasev1.0.0-beta.7
本版本重点增强了诊断能力、网络弹性和代理支持。修复了 manifest 抓取密集重试轰击和下载状态持久化残留导致的无限循环问题,统一了远端 JSON 反序列化的错误上下文,新增代理"自动检测"模式作为默认值,并完善了汉化管理(资源面板)的 UID 来源管理与格式校验。
本次更新新增了 4 项特性,优化了 3 项,修复了 9 个问题。
新增
-
代理模式新增"自动检测"选项:新增
ProxyModes.Auto常量,作为代理设置的默认值(替代原先的Direct)。Auto 模式通过WebRequest.GetSystemWebProxy()自动检测系统代理配置——Windows 上读取 IE/Edge 代理设置,macOS 上读取系统代理,Linux 上读取环境变量。原有的Direct(直连)和System(手动配置系统代理)模式保持不变,三种模式按 Auto → Direct → System 顺序排列。对应新增proxyAuto本地化键(en: "Auto-detect"、zh-Hans: "跟随系统"、zh-Hant: "跟隨系統"、ja: "自動検出")。参见 dotnet HttpClient proxy 文档 了解 .NET 代理配置机制。 -
汉化管理(资源面板)UID 来源管理:新增
ResourcePanelUidSources常量和resourcePanelUidSource设置字段,支持在"自动检测"(从 cookie 或设置文件读取)和"自定义"(手动输入)之间切换 UID 来源。UI 新增 UID 展示/编辑卡片和来源 ComboBox(ToggleSwitch → CheckBox),支持编辑流程(BeginEdit / CancelEdit),自定义输入时先校验格式。 -
汉化管理 UID 格式校验:新增
ResourcePanelUidService.IsValidUid静态方法,校验 UID 格式为/^[A-Z]{8}$/(8 位大写字母)。ResolveUidAsync对 cookie 和 settings 读取的 UID 做格式校验,无效则视为空;SaveManualUidAsync拒绝无效格式并抛出ArgumentException。UI 层先校验再保存,失败时显示本地化错误提示(resourcePanelUidInvalidFormat键)。 -
汉化管理状态图标刷新:新增
ResourcePanelStatusToBrushConverter,根据加载 / 就绪 / 等待 / 失败状态动态映射图标颜色,替代原有的静态图标显示。
优化
-
远端 JSON 反序列化统一化:将
DeserializeJsonAsyncsniff helper 从LauncherApiClient提取到RemoteHttpRequestService,LauncherApiClient、LauncherUpdateService、ResourcePanelApiClient统一接入。所有远端 JSON 反序列化点现在都产出带 URL、HTTP 状态码、Content-Type 和字节预览的富错误信息,大幅提升网络故障的诊断效率。 -
HTTP 响应自动解压:
HttpClientFactory和ProxySettingsService创建的SocketsHttpHandler统一启用AutomaticDecompression = DecompressionMethods.All,透明解压 CDN 或代理返回的 gzip/deflate/Brotli 压缩响应。此前压缩响应无法被反序列化,产生不可诊断的ExpectedStartOfValueNotFound错误(如日志中出现的0x8Bgzip 魔数)。 -
汉化管理网络层重试退避:
ResourcePanelApiClient新增SendWithRetryAsync方法,实现 2 次重试 + 800ms × attempt 线性退避。仅在网络异常(HttpRequestException/TaskCanceledException)时重试,HTTP 非 2xx 不重试。三个端点(/status/list、/config/get、/config/set)全部接入,行为与 dashboard 项目fetchWithRetry保持一致。
修复
-
修复 manifest 抓取密集重试轰击:日志中 manifest 抓取出现 528 次连续失败,根因是 refresh → resume → fail 无限循环——
RunAsync在抓取 manifest 前保存DownloadTaskState,网络失败后未清除持久化状态,导致每次RefreshAsync都重新触发ResumePersistedDownloadAsync。修复方案:(1)GetRemoteManifestAsync改为 3 次有限重试 + 指数退避(500ms / 1000ms),对齐FileDownloadService的有限重试模式;(2)RunAsync网络失败时调用ClearDownloadState()打破循环。 -
修复 RunAsync 全部失败路径的持久化下载状态残留:
RunAsync在 manifest 抓取前调用SaveDownloadStateAsync,但原先仅网络失败路径清除了持久化状态。其余 7 条失败路径(游戏运行中、CDN 配置不完整、磁盘空间预检查失败、验证 3 次重试后仍失败、磁盘满 IOException、IO/权限异常、catch-all 意外异常)均未清除,均可能触发 refresh → resume → fail 循环。现已补全所有路径的ClearDownloadState()调用。DownloadTaskState仅存储元数据(版本/basis/路径/isRepair/patchUrlGroup),不存储下载进度,因此清除状态不丢失已下载文件。 -
修复远端 manifest 非 JSON 响应导致的不可诊断失败:此前
GetRemoteManifestAsync对非 JSON 响应仅抛出ExpectedStartOfValueNotFound异常,无 URL、HTTP 状态码、Content-Type 上下文。现在DeserializeRemoteJsonAsync缓冲响应体后反序列化,失败时抛出带完整上下文的JsonException(URL、状态码、Content-Type、前 16 字节十六进制/ASCII 预览、gzip/zlib/zstd/bzip2 魔数识别),配合AutomaticDecompression=All自动解压,彻底消除了此类不可诊断失败。 -
修复 ToastSeverityToBrushConverter 主题变体处理:改为使用
ActualThemeVariant替代ThemeVariant.Default,确保 Toast 图标颜色正确跟随当前应用主题(浅色/深色)。 -
修复 OnSelectedResourcePanelUidSourceChanged 无限递归:新增
isSettingUidSource守卫标志防止属性变更回调中的递归触发。 -
修复 SaveManualResourcePanelUid 并发加载:新增属性赋值守卫防止并发调用导致的竞态条件。
-
修复 ResourcePanelUidService 正则表达式性能:迁移至
[GeneratedRegex]源生成器,消除运行时正则编译开销。 -
修复设置归一化中代理默认值:
LauncherSettingsService和SettingsEditor的归一化逻辑将无效代理值回退为ProxyModes.Auto(此前回退为Direct),与LauncherSettings声明默认值保持一致。 -
修复
HttpClientFactory代理判断逻辑:CreateLeaseAsync中代理模式判断从!= System改为== Direct,使 Auto 模式正确走代理感知路径(通过ProxySettingsService.CreateHttpHandlerAsync创建带系统代理检测的 handler)。