From bf71cd796fc715ac4e5f89587b1a39ef522758eb Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Thu, 8 May 2025 15:26:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20WpfGui=E6=8B=86=E8=A7=A3GetAsync,?= =?UTF-8?q?=20=E6=9A=B4=E9=9C=B2Exception,=20=E5=A2=9E=E5=8A=A0PostAsync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Helper/ETagCache.cs | 12 +- src/MaaWpfGui/Models/ResourceUpdater.cs | 30 +++- src/MaaWpfGui/Services/Web/HttpService.cs | 141 +++++++++--------- src/MaaWpfGui/Services/Web/IHttpService.cs | 17 ++- .../ViewModels/UI/VersionUpdateViewModel.cs | 13 +- 5 files changed, 128 insertions(+), 85 deletions(-) diff --git a/src/MaaWpfGui/Helper/ETagCache.cs b/src/MaaWpfGui/Helper/ETagCache.cs index 9a1c094800..c797af2f22 100644 --- a/src/MaaWpfGui/Helper/ETagCache.cs +++ b/src/MaaWpfGui/Helper/ETagCache.cs @@ -98,8 +98,16 @@ namespace MaaWpfGui.Helper headers["If-None-Match"] = etag; } - var response = await Instances.HttpService.GetAsync(new Uri(url), headers); - return response; + try + { + var response = await Instances.HttpService.GetAsync(new Uri(url), headers); + return response; + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", url); + return null; + } } } } diff --git a/src/MaaWpfGui/Models/ResourceUpdater.cs b/src/MaaWpfGui/Models/ResourceUpdater.cs index 04d0a131f6..e0ff0c278a 100644 --- a/src/MaaWpfGui/Models/ResourceUpdater.cs +++ b/src/MaaWpfGui/Models/ResourceUpdater.cs @@ -15,6 +15,7 @@ using System; using System.IO; using System.IO.Compression; +using System.Net.Http; using System.Threading.Tasks; using MaaWpfGui.Constants; using MaaWpfGui.Extensions; @@ -121,8 +122,16 @@ namespace MaaWpfGui.Models var url = $"{BaseUrl}?current_version={currentVersion}&cdk={cdk}&user_agent=MaaWpfGui&sp_id={spid}"; - var response = await Instances.HttpService.GetAsync(new(url), logQuery: false); - _logger.Information($"current_version: {currentVersion}, cdk: {cdk.Mask()}"); + HttpResponseMessage? response = null; + try + { + response = await Instances.HttpService.GetAsync(new(url), logQuery: false); + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", new Uri(url).GetLeftPart(UriPartial.Path)); + _logger.Information($"current_version: {currentVersion}, cdk: {cdk.Mask()}"); + } if (response is null) { @@ -339,14 +348,21 @@ namespace MaaWpfGui.Models private static async Task DownloadFullPackageAsync(string url, string saveTo) { - using var response = await Instances.HttpService.GetAsync(new Uri(url)); - - if (response is not { StatusCode: System.Net.HttpStatusCode.OK }) + try { + using var response = await Instances.HttpService.GetAsync(new Uri(url)); + if (response is not { StatusCode: System.Net.HttpStatusCode.OK }) + { + return false; + } + + return await HttpResponseHelper.SaveResponseToFileAsync(response, saveTo); + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", url); return false; } - - return await HttpResponseHelper.SaveResponseToFileAsync(response, saveTo); } private static void DirectoryMerge(string sourceDirName, string destDirName) diff --git a/src/MaaWpfGui/Services/Web/HttpService.cs b/src/MaaWpfGui/Services/Web/HttpService.cs index 8fe04b1d80..b1fc48ef71 100755 --- a/src/MaaWpfGui/Services/Web/HttpService.cs +++ b/src/MaaWpfGui/Services/Web/HttpService.cs @@ -107,75 +107,65 @@ namespace MaaWpfGui.Services.Web } } - public async Task GetStringAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead, bool logQuery = true) - { - var response = await GetAsync(uri, extraHeader, httpCompletionOption, logQuery); - - if (response?.StatusCode != HttpStatusCode.OK) - { - return null; - } - - return await response.Content.ReadAsStringAsync(); - } - - public async Task GetStreamAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead, bool logQuery = true) - { - var response = await GetAsync(uri, extraHeader, httpCompletionOption, logQuery); - - if (response?.StatusCode != HttpStatusCode.OK) - { - return null; - } - - return await response.Content.ReadAsStreamAsync(); - } - - public async Task GetAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseHeadersRead, bool logQuery = true) + public async Task GetStringAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead) { try { - var request = new HttpRequestMessage { RequestUri = uri, Method = HttpMethod.Get, Version = HttpVersion.Version20, }; - - if (extraHeader != null) + var response = await GetAsync(uri, extraHeader, httpCompletionOption); + if (response.StatusCode != HttpStatusCode.OK) { - foreach (var kvp in extraHeader) - { - request.Headers.Add(kvp.Key, kvp.Value); - } + return null; } - var response = await _client.SendAsync(request, httpCompletionOption); - response.Log(logQuery); - - return response; + return await response.Content.ReadAsStringAsync(); } catch (Exception e) { - _logger.Error(e, "Failed to send GET request to {Uri}", uri.GetLeftPart(logQuery ? UriPartial.Query : UriPartial.Path)); + _logger.Error(e, "Failed to send GET request to {Uri}", uri); return null; } } + public async Task GetStreamAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead) + { + try + { + var response = await GetAsync(uri, extraHeader, httpCompletionOption); + if (response.StatusCode != HttpStatusCode.OK) + { + return null; + } + + return await response.Content.ReadAsStreamAsync(); + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", uri); + return null; + } + } + + public async Task GetAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseHeadersRead, bool logQuery = true) + { + var request = new HttpRequestMessage { RequestUri = uri, Method = HttpMethod.Get, Version = HttpVersion.Version20, }; + if (extraHeader != null) + { + foreach (var kvp in extraHeader) + { + request.Headers.Add(kvp.Key, kvp.Value); + } + } + + var response = await _client.SendAsync(request, httpCompletionOption); + response.Log(logQuery); + return response; + } + public async Task PostAsJsonAsync(Uri uri, T content, Dictionary? extraHeader = null) { try { - var body = JsonSerializer.Serialize(content); - var message = new HttpRequestMessage(HttpMethod.Post, uri) { Version = HttpVersion.Version20 }; - - if (extraHeader is not null) - { - foreach (var header in extraHeader) - { - message.Headers.Add(header.Key, header.Value); - } - } - - message.Headers.Accept.ParseAdd("application/json"); - message.Content = new StringContent(body, Encoding.UTF8, "application/json"); - var response = await _client.SendAsync(message); - response.Log(); + var response = await PostAsync(uri, new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json"), extraHeader); return await response.Content.ReadAsStringAsync(); } catch (Exception e) @@ -189,20 +179,7 @@ namespace MaaWpfGui.Services.Web { try { - var message = new HttpRequestMessage(HttpMethod.Post, uri) { Version = HttpVersion.Version20 }; - message.Headers.Accept.ParseAdd("application/json"); - - if (extraHeader is not null) - { - foreach (var header in extraHeader) - { - message.Headers.Add(header.Key, header.Value); - } - } - - message.Content = new FormUrlEncodedContent(content); - var response = await _client.SendAsync(message); - response.Log(); + var response = await PostAsync(uri, new FormUrlEncodedContent(content), extraHeader); return await response.Content.ReadAsStringAsync(); } catch (Exception e) @@ -212,6 +189,24 @@ namespace MaaWpfGui.Services.Web } } + public async Task PostAsync(Uri uri, HttpContent content, Dictionary? extraHeader = null) + { + var message = new HttpRequestMessage(HttpMethod.Post, uri) { Version = HttpVersion.Version20 }; + if (extraHeader is not null) + { + foreach (var header in extraHeader) + { + message.Headers.Add(header.Key, header.Value); + } + } + + message.Headers.Accept.ParseAdd("application/json"); + message.Content = content; + var response = await _client.SendAsync(message); + response.Log(); + return response; + } + public async Task DownloadFileAsync(Uri uri, string fileName, string? contentType = "application/octet-stream") { string fileDir = Directory.GetCurrentDirectory(); @@ -220,10 +215,18 @@ namespace MaaWpfGui.Services.Web string fullFilePathWithTemp = Path.Combine(fileDir, fileNameWithTemp); _logger.Information("Start to download file from {Uri} and save to {TempPath}", uri, fullFilePathWithTemp); - var response = await GetAsync(uri, extraHeader: new Dictionary { { "Accept", contentType ?? "application/octet-stream" } }, httpCompletionOption: HttpCompletionOption.ResponseHeadersRead); - - if (response?.StatusCode != HttpStatusCode.OK) + HttpResponseMessage response; + try { + response = await GetAsync(uri, extraHeader: new Dictionary { { "Accept", contentType ?? "application/octet-stream" } }, httpCompletionOption: HttpCompletionOption.ResponseHeadersRead); + if (response.StatusCode != HttpStatusCode.OK) + { + return false; + } + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", uri); return false; } diff --git a/src/MaaWpfGui/Services/Web/IHttpService.cs b/src/MaaWpfGui/Services/Web/IHttpService.cs index f84552c8f8..5f51a18cd2 100644 --- a/src/MaaWpfGui/Services/Web/IHttpService.cs +++ b/src/MaaWpfGui/Services/Web/IHttpService.cs @@ -36,9 +36,8 @@ namespace MaaWpfGui.Services.Web /// Target Uri /// Extra HTTP Request Headers /// The HTTP completion option - /// Whether to log uri /// Response string, null when failed - Task GetStringAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead, bool logQuery = true); + Task GetStringAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead); /// /// Send HTTP GET request and get a body stream response @@ -46,10 +45,9 @@ namespace MaaWpfGui.Services.Web /// Target Uri /// Extra HTTP Request Headers /// The HTTP completion option - /// Whether to log uri /// Response stream, null when failed // ReSharper disable once UnusedMember.Global - Task GetStreamAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead, bool logQuery = true); + Task GetStreamAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead); /// /// Send HTTP GET request and get the original @@ -59,7 +57,7 @@ namespace MaaWpfGui.Services.Web /// The HTTP completion option /// Whether to log uri /// object - Task GetAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseHeadersRead, bool logQuery = true); + Task GetAsync(Uri uri, Dictionary? extraHeader = null, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseHeadersRead, bool logQuery = true); /// /// Send HTTP POST request and a string response @@ -80,6 +78,15 @@ namespace MaaWpfGui.Services.Web /// Response string, null when failed Task PostAsFormUrlEncodedAsync(Uri uri, Dictionary content, Dictionary? extraHeader = null); + /// + /// Send HTTP POST request with raw HttpContent and get the response + /// + /// Target Uri + /// The POST body content + /// Extra HTTP Request Headers + /// HttpResponseMessage, null when failed + Task PostAsync(Uri uri, HttpContent content, Dictionary? extraHeader = null); + /// /// Download a file from the Web /// diff --git a/src/MaaWpfGui/ViewModels/UI/VersionUpdateViewModel.cs b/src/MaaWpfGui/ViewModels/UI/VersionUpdateViewModel.cs index 4b29efbec8..f3b6bbf5ed 100644 --- a/src/MaaWpfGui/ViewModels/UI/VersionUpdateViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/VersionUpdateViewModel.cs @@ -18,6 +18,7 @@ using System.Collections.ObjectModel; using System.IO; using System.IO.Compression; using System.Linq; +using System.Net.Http; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -963,8 +964,16 @@ public class VersionUpdateViewModel : Screen var url = $"{MaaUrls.MirrorChyanAppUpdate}?current_version={_curVersion}&cdk={cdk}&user_agent=MaaWpfGui&os=win&arch={arch}&channel={channel}&sp_id={spid}"; - var response = await Instances.HttpService.GetAsync(new(url), logQuery: false); - _logger.Information($"current_version: {_curVersion}, cdk: {cdk.Mask()}, arch: {arch}, channel: {channel}"); + HttpResponseMessage? response = null; + try + { + response = await Instances.HttpService.GetAsync(new(url), logQuery: false); + } + catch (Exception e) + { + _logger.Error(e, "Failed to send GET request to {Uri}", new Uri(url).GetLeftPart(UriPartial.Path)); + _logger.Information($"current_version: {_curVersion}, cdk: {cdk.Mask()}, arch: {arch}, channel: {channel}"); + } if (response is null) {