1
huangxiaoqiang
2025-04-09 b8cd98f0a2d8a7e644563eb67d4c88371279a729
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs
@@ -13,10 +13,10 @@
    private static readonly LogFactory LogFactory = new LogFactory();
    // 封装一个用HttpClient发送GET请求的方法有参数
    public static async Task<string> GetAsync(string url, Dictionary<string, string> parameters)
    public static async Task<string> GetAsync(string url, Dictionary<string, object> parameters)
    {
        // 记录请求参数
        LogRequestParameters(parameters);
        LogRequestParameters(parameters, url);
        // 将参数拼接到URL中
        string queryString = string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}"));
@@ -35,27 +35,61 @@
            string responseBody = await response.Content.ReadAsStringAsync();
            // 记录响应参数
            LogResponseParameters(responseBody);
            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, string> parameters)
    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(3))
            {
                // 如果请求次数超过限制且未超过10分钟,抛出异常
                throw new InvalidOperationException("请求次数已达到限制,请稍后再试。");
            }
        }
        // 更新请求跟踪信息
        if (requestTracker.ContainsKey(requestKey))
        {
            requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now);
        }
        else
        {
            requestTracker[requestKey] = (1, DateTime.Now);
        }
        // 记录请求参数
        LogRequestParameters(parameters);
        LogRequestParameters(parameters, url);
        // 创建HttpClient实例
        using (HttpClient client = new HttpClient())
        {
            // 将参数转换为FormUrlEncodedContent
            FormUrlEncodedContent content = new FormUrlEncodedContent(parameters);
            string content = JsonConvert.SerializeObject(parameters);
            // 发送POST请求并获取响应
            HttpResponseMessage response = await client.PostAsync(url, content);
            //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();
@@ -64,20 +98,40 @@
            string responseBody = await response.Content.ReadAsStringAsync();
            // 记录响应参数
            LogResponseParameters(responseBody);
            LogResponseParameters(responseBody, url);
            // 返回响应内容
            return responseBody;
        }
    }
    private static void LogRequestParameters(Dictionary<string, string> parameters)
    private static void LogRequestParameters(Dictionary<string, object> parameters, string url = "")
    {
        LogFactory.GetLog("API接口").Info(true, "请求参数: " + JsonConvert.SerializeObject(parameters));
        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)
    private static void LogResponseParameters(string responseBody, string url = "")
    {
        LogFactory.GetLog("API接口").Info(true, "响应参数: " + responseBody);
        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());
        }
    }
}