using LogLibrary.Log; 
 | 
using Newtonsoft.Json; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using System.Timers; 
 | 
using Timer = System.Timers.Timer; 
 | 
  
 | 
namespace WIDESEA_Common; 
 | 
  
 | 
public class HttpsClient 
 | 
{ 
 | 
    private static readonly Timer cleanupTimer; 
 | 
  
 | 
    static HttpsClient() 
 | 
    { 
 | 
        // 设置定时器,每5分钟清理一次requestTracker的数据 
 | 
        cleanupTimer = new Timer(2 * 60 * 1000); 
 | 
        cleanupTimer.Elapsed += CleanupRequestTracker; 
 | 
        cleanupTimer.AutoReset = true; 
 | 
        cleanupTimer.Enabled = true; 
 | 
    } 
 | 
  
 | 
    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 >= 10 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(2)) 
 | 
            { 
 | 
                // 如果请求次数超过限制且未超过10分钟,抛出异常 
 | 
                Console.WriteLine("请求次数已达到限制,请稍后再试。"); 
 | 
                Console.WriteLine($"接口地址:{url}"); 
 | 
                Console.WriteLine($"请求数据:{JsonConvert.SerializeObject(filteredParameters, Formatting.Indented)}"); 
 | 
                throw new Exception($"接口地址:{url}---请求次数已达到限制,请稍后再试。"); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        // 更新请求跟踪信息 
 | 
        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()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // 清理requestTracker的方法 
 | 
    private static void CleanupRequestTracker(object sender, ElapsedEventArgs e) 
 | 
    { 
 | 
        // 获取当前时间 
 | 
        DateTime now = DateTime.Now; 
 | 
  
 | 
        // 遍历并清理requestTracker中超过10分钟的记录 
 | 
        var keysToRemove = requestTracker.Keys.Where(key => now > requestTracker[key].LastRequestTime.AddMinutes(2)).ToList(); 
 | 
  
 | 
        foreach (var key in keysToRemove) 
 | 
        { 
 | 
            requestTracker.Remove(key); 
 | 
        } 
 | 
    } 
 | 
} 
 |