From 9d0efbba801d7c2dd7e6881e770d84d1f2d805cb Mon Sep 17 00:00:00 2001 From: XerolySkinner Date: Wed, 28 Jan 2026 20:31:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=A5=E5=B9=B2=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ramitta/HttpHelper.cs | 69 ++++++++++++++++++++++++------------------ Ramitta/Ramitta.csproj | 2 +- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Ramitta/HttpHelper.cs b/Ramitta/HttpHelper.cs index 8019236..6076cda 100644 --- a/Ramitta/HttpHelper.cs +++ b/Ramitta/HttpHelper.cs @@ -1,5 +1,6 @@ using System.IO; using System.Net; +using System.Net.Http; using System.Text; namespace Ramitta.lib @@ -14,8 +15,6 @@ namespace Ramitta.lib HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Timeout = timeout; - request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"; - using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) @@ -29,44 +28,56 @@ namespace Ramitta.lib } } - public static async Task SendHttpPostAsync(string url, string jsonData, int timeout = 10000) + public static async Task SendHttpPostAsync(string url, string jsonData, int timeout = 10000, bool bypassProxy = true) { try { - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); - request.Method = "POST"; - request.Timeout = timeout; - request.ContentType = "application/json"; - request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + var handler = new HttpClientHandler(); - byte[] data = Encoding.UTF8.GetBytes(jsonData); - request.ContentLength = data.Length; - - using (Stream requestStream = await request.GetRequestStreamAsync()) + if (bypassProxy) { - await requestStream.WriteAsync(data, 0, data.Length); + // 方法1:不使用代理 + handler.UseProxy = false; + handler.Proxy = null; + + // 方法2:指定某些地址不代理 + // handler.Proxy = new WebProxy(); + // handler.UseProxy = true; + // handler.PreAuthenticate = true; + } + else + { + // 使用系统代理 + handler.UseProxy = true; + handler.Proxy = WebRequest.GetSystemWebProxy(); } - using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) - using (Stream responseStream = response.GetResponseStream()) - using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) + // 可选:禁用自动重定向 + handler.AllowAutoRedirect = false; + + using (var client = new HttpClient(handler)) { - return await reader.ReadToEndAsync(); + client.Timeout = TimeSpan.FromMilliseconds(timeout); + var content = new StringContent(jsonData, Encoding.UTF8, "application/json"); + var response = await client.PostAsync(url, content); + + // 确保成功状态 + if (!response.IsSuccessStatusCode) + { + var errorContent = await response.Content.ReadAsStringAsync(); + throw new Exception($"HTTP错误 {(int)response.StatusCode} ({response.StatusCode}): {errorContent}"); + } + + return await response.Content.ReadAsStringAsync(); } } - catch (WebException ex) + catch (HttpRequestException ex) { - WebResponse errorResponse = ex.Response; - if (errorResponse is HttpWebResponse httpErrorResponse) - { - using (Stream errorStream = httpErrorResponse.GetResponseStream()) - using (StreamReader errorReader = new StreamReader(errorStream, Encoding.UTF8)) - { - string errorContent = await errorReader.ReadToEndAsync(); - throw new Exception($"HTTP错误 {(int)httpErrorResponse.StatusCode} ({httpErrorResponse.StatusCode}): {errorContent}"); - } - } - throw new Exception("网络错误: " + ex.Message); + throw new Exception("HTTP请求失败: " + ex.Message); + } + catch (TaskCanceledException ex) + { + throw new Exception("请求超时: " + ex.Message); } catch (Exception ex) { diff --git a/Ramitta/Ramitta.csproj b/Ramitta/Ramitta.csproj index 5ea4399..a2d07bc 100644 --- a/Ramitta/Ramitta.csproj +++ b/Ramitta/Ramitta.csproj @@ -1,4 +1,4 @@ - + net8.0-windows