fix: 网络连接错误的情况下读取了本地缓存也提示了获取热更成功

This commit is contained in:
uye
2025-09-20 13:38:39 +08:00
parent 305f40a6c6
commit 98ea157655
3 changed files with 43 additions and 18 deletions

View File

@@ -83,7 +83,13 @@ namespace MaaWpfGui.Services
}
}
MergePermanentAndActivityStages(await LoadWebStages());
var webStages = await LoadWebStages();
if (webStages is null)
{
return;
}
MergePermanentAndActivityStages(webStages);
_ = Execute.OnUIThreadAsync(() =>
{
@@ -139,17 +145,18 @@ namespace MaaWpfGui.Services
}
*/
private static async Task<JObject> LoadWebStages()
private static async Task<JObject?> LoadWebStages()
{
var clientType = GetClientType();
var activityTask = Instances.MaaApiService.RequestMaaApiWithCache(StageApi);
var tasksTask = Instances.MaaApiService.RequestMaaApiWithCache(TasksApi);
var activityTask = Instances.MaaApiService.RequestMaaApiWithCache(StageApi, false);
var tasksTask = Instances.MaaApiService.RequestMaaApiWithCache(TasksApi, false);
await Task.WhenAll(activityTask, tasksTask);
JObject activity = await activityTask;
JObject tasksJson = await tasksTask;
var activityJson = await activityTask;
var tasksJson = await tasksTask;
JObject? globalTasksJson = null;
if (clientType != "Official" && tasksJson != null)
{
var tasksPath = "resource/global/" + clientType + '/' + TasksApi;
@@ -157,14 +164,24 @@ namespace MaaWpfGui.Services
// Download the client specific resources only when the Official ones are successfully downloaded so that the client specific resource version is the actual version
// TODO: There may be an issue when the CN resource is loaded from cache (e.g. network down) while global resource is downloaded (e.g. network up again)
// var tasksJsonClient = fromWeb ? WebService.RequestMaaApiWithCache(tasksPath) : WebService.RequestMaaApiWithCache(tasksPath);
await Instances.MaaApiService.RequestMaaApiWithCache(tasksPath);
globalTasksJson = await Instances.MaaApiService.RequestMaaApiWithCache(tasksPath, false);
}
if (activityJson is null || tasksJson is null)
{
return null;
}
if (clientType != "Official" && globalTasksJson is null)
{
return null;
}
await Task.Run(() =>
{
Instances.AsstProxy.LoadResource();
});
return activity;
return activityJson;
}
private void MergePermanentAndActivityStages(JObject? activity)

View File

@@ -18,7 +18,7 @@ namespace MaaWpfGui.Services.Web
{
public interface IMaaApiService
{
Task<JObject> RequestMaaApiWithCache(string api);
Task<JObject> RequestMaaApiWithCache(string api, bool allowFallbackToCache = true);
JObject LoadApiCache(string api);
}

View File

@@ -26,35 +26,43 @@ namespace MaaWpfGui.Services.Web
{
private static readonly string CacheDir = PathsHelper.BaseDir + "/cache/";
public async Task<JObject?> RequestMaaApiWithCache(string api)
public async Task<JObject?> RequestMaaApiWithCache(string api, bool allowFallbackToCache = true)
{
return await RequestWithFallback(api, MaaUrls.MaaApi, MaaUrls.MaaApi2);
return await RequestWithFallback(api, MaaUrls.MaaApi, MaaUrls.MaaApi2, allowFallbackToCache);
}
private async Task<JObject?> RequestWithFallback(string api, string primaryBaseUrl, string? fallbackBaseUrl = null)
private async Task<JObject?> RequestWithFallback(string api, string primaryBaseUrl, string? fallbackBaseUrl = null, bool allowFallbackToCache = true)
{
var json = await TryRequest(api, primaryBaseUrl);
var json = await TryRequest(api, primaryBaseUrl, allowFallbackToCache);
if (json != null || string.IsNullOrEmpty(fallbackBaseUrl))
{
return json;
}
return await TryRequest(api, fallbackBaseUrl);
return await TryRequest(api, fallbackBaseUrl, allowFallbackToCache);
}
private async Task<JObject?> TryRequest(string api, string baseUrl)
private async Task<JObject?> TryRequest(string api, string baseUrl, bool allowFallbackToCache = true)
{
var url = baseUrl + api;
var cache = CacheDir + api;
var response = await ETagCache.FetchResponseWithEtag(url, !File.Exists(cache));
if (response == null ||
response.StatusCode == System.Net.HttpStatusCode.NotModified ||
response.StatusCode != System.Net.HttpStatusCode.OK)
if (response == null)
{
return allowFallbackToCache ? LoadApiCache(api) : null;
}
if (response.StatusCode == System.Net.HttpStatusCode.NotModified)
{
return LoadApiCache(api);
}
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
return allowFallbackToCache ? LoadApiCache(api) : null;
}
var body = await HttpResponseHelper.GetStringAsync(response);
if (string.IsNullOrEmpty(body))
{