刘磊
5 天以前 5eeed44ad21748ed7560a8c688d4e2d2f03555c8
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs
@@ -4,11 +4,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
using WIDESEA.Common;
using Formatting = System.Xml.Formatting;
namespace WIDESEA_Common;
@@ -51,218 +47,82 @@
    // å°è£…一个用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))
        try
        {
            if (requestInfo.Count >= 5 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(10))
            // åˆ›å»ºä¸€ä¸ªæ–°çš„字典,排除 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))
            {
                // å¦‚果请求次数超过限制且未超过10分钟,抛出异常
                throw new InvalidOperationException("请求次数已达到限制,请稍后再试。");
                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, 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;
            }
        }
        // æ›´æ–°è¯·æ±‚跟踪信息
        if (requestTracker.ContainsKey(requestKey))
        catch (Exception ex)
        {
            requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now);
        }
        else
        {
            requestTracker[requestKey] = (1, DateTime.Now);
            LogErrorParameters(ex.StackTrace, ex.Message, url);
            return ex.Message;
        }
        // è®°å½•请求参数
        LogRequestParameters(parameters, url);
        // åˆ›å»ºHttpClient实例
        using (HttpClient client = new HttpClient())
        {
            // å°†å‚数转换为FormUrlEncodedContent
            //string content = JsonConvert.SerializeObject(parameters);
            var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters));
            //client.Timeout = TimeSpan.from;
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Content = content;
            //request.Content = new StringContent(content, Encoding.UTF8, "application/json");
            //// å‘送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;
        }
    }
    // å°è£…一个用HttpClient发送Post请求的方法有参数
    public static string Post(string url)
    private static void LogErrorParameters(string errordetail, string error, string url = "")
    {
        // è®°å½•请求参数
        //LogRequestParameters(null, url);
        // åˆ›å»ºHttpClient实例
        using (HttpClient client = new HttpClient())
        {
            // å°†å‚数转换为FormUrlEncodedContent
            //string content = JsonConvert.SerializeObject(parameters);
            //var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters));
            //client.Timeout = TimeSpan.from;
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            //request.Content = content;
            //request.Content = new StringContent(content, Encoding.UTF8, "application/json");
            //// å‘送POST请求并获取响应
            //HttpResponseMessage response = await client.PostAsync(url, content);
            HttpResponseMessage response = client.Send(request);
            // ç¡®ä¿å“åº”成功
            response.EnsureSuccessStatusCode();
            // è¯»å–响应内容
            Stream stream = response.Content.ReadAsStream();
            StreamReader streamReader = new StreamReader(stream);
            string webResponse = streamReader.ReadToEnd();
            // è®°å½•响应参数
            LogResponseParameters(webResponse, url);
            // è¿”回响应内容
            return webResponse;
        }
        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);
    }
    public static string PostXml(string url, Dictionary<string, object> parameters)
    {
        // è®°å½•请求参数
        LogRequestParameters(parameters, url);
        // åˆ›å»ºHttpClient实例
        using (HttpClient client = new HttpClient())
        {
            // å°†å‚数转换为FormUrlEncodedContent
            //string content = JsonConvert.SerializeObject(parameters);
            var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters));
            //十秒超时
            client.Timeout = new TimeSpan(0, 0, 10);
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Content = content;
            //request.Content = new StringContent(content, Encoding.UTF8, "application/json");
            //// å‘送POST请求并获取响应
            //HttpResponseMessage response = await client.PostAsync(url, content);
            HttpResponseMessage response = client.Send(request);
            // ç¡®ä¿å“åº”成功
            response.EnsureSuccessStatusCode();
            //string xmlContent = await response.Content.ReadAsStringAsync();
            // è¯»å–响应内容
            Stream stream = response.Content.ReadAsStream();
            StreamReader streamReader = new StreamReader(stream);
            string respon = streamReader.ReadToEnd();
            //string webResponse = XmlToJson(respon);
            string webResponse = ReplaceXmlStyle(respon);
            // è¯»å–响应内容
            //Stream stream = response.Content.ReadAsStream();
            //StreamReader streamReader = new StreamReader(stream);
            //string webResponse = streamReader.ReadToEnd();
            // è®°å½•响应参数
            LogResponseParameters(webResponse, url);
            // è¿”回响应内容
            return webResponse;
        }
    }
    static string XmlToJson(string xmlContent)
    {
        // æå–内层 XML å†…容
        int startIndex = xmlContent.IndexOf("<?xml");
        string innerXml = xmlContent.Substring(startIndex);
        // åŽ»é™¤å¤–å±‚å¤šä½™çš„å†…å®¹ï¼ˆå‡è®¾å¤–å±‚åªæœ‰ <string> ç›¸å…³å†…容)
        innerXml = Regex.Replace(innerXml, @"^.*?<ROOT>", "<ROOT>");
        // å޻除内层 XML å£°æ˜Ž
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
        innerXml = innerXml.Replace("<string xmlns=\"http://tempuri.org/\">", "");
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
        // å¤„理转义字符
        innerXml = innerXml.Replace("&lt;", "<");
        innerXml = innerXml.Replace("&gt;", ">");
        innerXml = innerXml.Replace("</string>", "");
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
        //innerXml = innerXml.Replace("<ROOT>", "");
        //innerXml = innerXml.Replace("</ROOT>", "");
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(innerXml);
        // å°†XML转换为JSON
        string json = JsonConvert.SerializeXmlNode(xmlDoc);
        return json;
    }
    static string ReplaceXmlStyle(string xmlContent)
    {
        // æå–内层 XML å†…容
        int startIndex = xmlContent.IndexOf("<?xml");
        string innerXml = xmlContent.Substring(startIndex);
        // åŽ»é™¤å¤–å±‚å¤šä½™çš„å†…å®¹ï¼ˆå‡è®¾å¤–å±‚åªæœ‰ <string> ç›¸å…³å†…容)
        innerXml = Regex.Replace(innerXml, @"^.*?<ROOT>", "<ROOT>");
        // å޻除内层 XML å£°æ˜Ž
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
        innerXml = innerXml.Replace("<string xmlns=\"http://tempuri.org/\">", "");
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
        // å¤„理转义字符
        innerXml = innerXml.Replace("&lt;", "<");
        innerXml = innerXml.Replace("&gt;", ">");
        innerXml = innerXml.Replace("</string>", "");
        innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
        //innerXml = innerXml.Replace("<ROOT>", "");
        //innerXml = innerXml.Replace("</ROOT>", "");
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(innerXml);
        return xmlDoc.InnerXml;
        //return xmlContent;
    }
    private static void LogRequestParameters(Dictionary<string, object> parameters, string url = "")
    {
        StringBuilder builder = new StringBuilder();
@@ -284,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)