刘磊
2025-06-18 40a36a347f78b8cbcad6f9abf54c4459ea9960f9
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs
@@ -42,41 +42,88 @@
        }
    }
    // 用于追踪每个请求的调用次数和最后请求时间。
    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)
    {
        // 记录请求参数
        LogRequestParameters(parameters, url);
        // 创建HttpClient实例
        using (HttpClient client = new HttpClient())
        try
        {
            // 将参数转换为FormUrlEncodedContent
            string content = JsonConvert.SerializeObject(parameters);
            // 创建一个新的字典,排除 RequestTime 和 SessionId
            var filteredParameters = parameters.Where(p => p.Key != "RequestTime" && p.Key != "SessionId").ToDictionary(p => p.Key, p => p.Value);
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            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("请求次数已达到限制,请稍后再试。");
                }
            }
            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);
            // 更新请求跟踪信息
            if (requestTracker.ContainsKey(requestKey))
            {
                requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now);
            }
            else
            {
                requestTracker[requestKey] = (1, DateTime.Now);
            }
            // 确保响应成功
            response.EnsureSuccessStatusCode();
            // 读取响应内容
            string responseBody = await response.Content.ReadAsStringAsync();
            // 记录请求参数
            LogRequestParameters(parameters, url);
            // 记录响应参数
            LogResponseParameters(responseBody, url);
            // 创建HttpClient实例
            using (HttpClient client = new HttpClient())
            {
                // 将参数转换为FormUrlEncodedContent
                string content = JsonConvert.SerializeObject(parameters);
            // 返回响应内容
            return responseBody;
                //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;
            }
        }
        catch (Exception ex)
        {
            LogErrorParameters(ex.StackTrace,ex.Message, url);
            return ex.Message;
        }
    }
    private static void LogRequestParameters(Dictionary<string, object> parameters,string url = "")
    private static void LogErrorParameters(string errordetail, string error, string url = "")
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(Environment.NewLine);
        builder.Append("---------------------------------------------");
        builder.Append(Environment.NewLine);
        builder.Append("url:" + url + "异常详细信息: " + JsonConvert.SerializeObject(error));
        builder.Append("url:" + url + "异常信息: " + JsonConvert.SerializeObject(error));
        LogFactory.GetLog("API接口异常").Error(true, builder);
    }
    private static void LogRequestParameters(Dictionary<string, object> parameters, string url = "")
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(Environment.NewLine);
@@ -97,6 +144,8 @@
        LogFactory.GetLog("API接口").Info(true, builder);
    }
    private static IEnumerable<KeyValuePair<string, string>> ConvertToKeyValuePairs(Dictionary<string, object> parameters)
    {
        foreach (var kvp in parameters)