| | |
| | | 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() |
| | | { |
| | | // è®¾ç½®å®æ¶å¨ï¼æ¯10å鿏
ç䏿¬¡requestTrackerçæ°æ® |
| | | cleanupTimer = new Timer(10 * 60 * 1000); |
| | | cleanupTimer.Elapsed += CleanupRequestTracker; |
| | | cleanupTimer.AutoReset = true; |
| | | cleanupTimer.Enabled = true; |
| | | } |
| | | |
| | | private static readonly LogFactory LogFactory = new LogFactory(); |
| | | |
| | | // å°è£
ä¸ä¸ªç¨HttpClientåéGET请æ±çæ¹æ³æåæ° |
| | |
| | | |
| | | // ç¨äºè¿½è¸ªæ¯ä¸ªè¯·æ±çè°ç¨æ¬¡æ°åæåè¯·æ±æ¶é´ã |
| | | 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); |
| | | 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)) |
| | | if (requestInfo.Count >= 5 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(5)) |
| | | { |
| | | // å¦æè¯·æ±æ¬¡æ°è¶
è¿éå¶ä¸æªè¶
è¿10åéï¼æåºå¼å¸¸ |
| | | Console.WriteLine("è¯·æ±æ¬¡æ°å·²è¾¾å°éå¶ï¼è¯·ç¨ååè¯ã"); |
| | | Console.WriteLine($"æ¥å£å°åï¼{url}"); |
| | | Console.WriteLine($"è¯·æ±æ°æ®ï¼{JsonConvert.SerializeObject(filteredParameters, Formatting.Indented)}"); |
| | | throw new Exception($"æ¥å£å°åï¼{url}---è¯·æ±æ¬¡æ°å·²è¾¾å°éå¶ï¼è¯·ç¨ååè¯ã"); |
| | | throw new Exception($"æ¥å£å°åï¼{url}---è¯·æ±æ¬¡æ°å·²è¾¾å°éå¶ï¼è¯·ç¨ååè¯ã"); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | requestTracker[requestKey] = (1, DateTime.Now); |
| | | } |
| | | |
| | | |
| | | // è®°å½è¯·æ±åæ° |
| | | LogRequestParameters(parameters, url); |
| | |
| | | } |
| | | } |
| | | |
| | | // æ¸
ç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(10)).ToList(); |
| | | |
| | | foreach (var key in keysToRemove) |
| | | { |
| | | requestTracker.Remove(key); |
| | | } |
| | | } |
| | | } |