| using LogLibrary.Log; | 
| using Newtonsoft.Json; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
|   | 
| namespace WIDESEA_Common; | 
|   | 
| public class HttpsClient | 
| { | 
|     private static readonly LogFactory LogFactory = new LogFactory(); | 
|   | 
|     // 封装一个用HttpClient发送GET请求的方法有参数 | 
|     public static async Task<string> GetAsync(string url, Dictionary<string, object> parameters) | 
|     { | 
|         // 记录请求参数 | 
|         LogRequestParameters(parameters, url); | 
|   | 
|         // 将参数拼接到URL中 | 
|         string queryString = string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}")); | 
|         url += "?" + queryString; | 
|   | 
|         // 创建HttpClient实例 | 
|         using (HttpClient client = new HttpClient()) | 
|         { | 
|             // 发送GET请求并获取响应 | 
|             HttpResponseMessage response = await client.GetAsync(url); | 
|   | 
|             // 确保响应成功 | 
|             response.EnsureSuccessStatusCode(); | 
|   | 
|             // 读取响应内容 | 
|             string responseBody = await response.Content.ReadAsStringAsync(); | 
|   | 
|             // 记录响应参数 | 
|             LogResponseParameters(responseBody, url); | 
|   | 
|             // 返回响应内容 | 
|             return responseBody; | 
|         } | 
|     } | 
|   | 
|     // 用于追踪每个请求的调用次数和最后请求时间。 | 
|     private static readonly Dictionary<string, (int Count, DateTime LastRequestTime)> requestTracker = new(); | 
|     // 封装一个用HttpClient发送Post请求的方法有参数 | 
|     public static async Task<string> PostAsync(string url, Dictionary<string, object> parameters) | 
|     { | 
|         // 创建一个新的字典,排除 RequestTime 和 SessionId | 
|         var filteredParameters = parameters.Where(p => p.Key != "RequestTime"&& p.Key != "SessionId").ToDictionary(p => p.Key, p => p.Value); | 
|   | 
|         string requestKey = $"{url}:{JsonConvert.SerializeObject(filteredParameters)}"; | 
|         // 检查请求次数和时间限制 | 
|         if (requestTracker.TryGetValue(requestKey, out var requestInfo)) | 
|         { | 
|             if (requestInfo.Count >= 5 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(10)) | 
|             { | 
|                 // 如果请求次数超过限制且未超过10分钟,抛出异常 | 
|                 throw new InvalidOperationException("请求次数已达到限制,请稍后再试。"); | 
|             } | 
|         } | 
|   | 
|         // 更新请求跟踪信息 | 
|         if (requestTracker.ContainsKey(requestKey)) | 
|         { | 
|             requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now); | 
|         } | 
|         else | 
|         { | 
|             requestTracker[requestKey] = (1, DateTime.Now); | 
|         } | 
|   | 
|   | 
|         // 记录请求参数 | 
|         LogRequestParameters(parameters, url); | 
|   | 
|         // 创建HttpClient实例 | 
|         using (HttpClient client = new HttpClient()) | 
|         { | 
|             // 将参数转换为FormUrlEncodedContent | 
|             string content = JsonConvert.SerializeObject(parameters); | 
|   | 
|             //client.Timeout = TimeSpan.from; | 
|   | 
|             var request = new HttpRequestMessage(HttpMethod.Post, url); | 
|   | 
|             request.Content = new StringContent(content, Encoding.UTF8, "application/json"); | 
|             //var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters)); | 
|             //// 发送POST请求并获取响应 | 
|             //HttpResponseMessage response = await client.PostAsync(url, content); | 
|             HttpResponseMessage response = await client.SendAsync(request); | 
|   | 
|             // 确保响应成功 | 
|             response.EnsureSuccessStatusCode(); | 
|   | 
|             // 读取响应内容 | 
|             string responseBody = await response.Content.ReadAsStringAsync(); | 
|   | 
|             // 记录响应参数 | 
|             LogResponseParameters(responseBody, url); | 
|   | 
|             // 返回响应内容 | 
|             return responseBody; | 
|         } | 
|     } | 
|   | 
|     private static void LogRequestParameters(Dictionary<string, object> parameters, string url = "") | 
|     { | 
|         StringBuilder builder = new StringBuilder(); | 
|         builder.Append(Environment.NewLine); | 
|         builder.Append("---------------------------------------------"); | 
|         builder.Append(Environment.NewLine); | 
|         builder.Append("url:" + url + "请求参数: " + JsonConvert.SerializeObject(parameters)); | 
|         LogFactory.GetLog("API接口").Info(true, builder); | 
|     } | 
|   | 
|     private static void LogResponseParameters(string responseBody, string url = "") | 
|     { | 
|         StringBuilder builder = new StringBuilder(); | 
|         builder.Append(Environment.NewLine); | 
|         builder.Append("url:" + url + "响应参数: " + responseBody); | 
|         builder.Append(Environment.NewLine); | 
|         builder.Append("---------------------------------------------"); | 
|         builder.Append(Environment.NewLine); | 
|         LogFactory.GetLog("API接口").Info(true, builder); | 
|     } | 
|   | 
|     private static IEnumerable<KeyValuePair<string, string>> ConvertToKeyValuePairs(Dictionary<string, object> parameters) | 
|     { | 
|         foreach (var kvp in parameters) | 
|         { | 
|             yield return new KeyValuePair<string, string>(kvp.Key, kvp.Value?.ToString()); | 
|         } | 
|     } | 
|   | 
| } |