HttpClientService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using DFS.Infrastructure.Extension.SM;
  2. using Edge.Core.Core.database;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. namespace Edge.Core.HttpClient
  11. {
  12. public class HttpClientService:IHttpClient
  13. {
  14. private static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
  15. private readonly string signMethod = "HMAC_SM4";
  16. private string acesskey = "";
  17. private string secretId = "";
  18. private string buildId = "";
  19. private string baseUrl = "";
  20. private readonly MysqlDbContext mysqlDbContext = new MysqlDbContext();
  21. private IHttpClientFactory _httpContextFactory;
  22. [ActivatorUtilitiesConstructor]
  23. public HttpClientService(IHttpClientFactory httpClientFactory)
  24. {
  25. _httpContextFactory = httpClientFactory;
  26. getHttpInfo();
  27. }
  28. private void getHttpInfo()
  29. {
  30. var fccStationInfo = mysqlDbContext.FccStationInfos.FirstOrDefault();
  31. if(fccStationInfo == null)
  32. {
  33. Logger.Info($"http client get station info fail");
  34. return;
  35. }
  36. secretId = fccStationInfo?.SecretId;
  37. buildId = fccStationInfo?.BuildId;
  38. acesskey = fccStationInfo?.AcessKey;
  39. baseUrl = fccStationInfo?.CloudService;
  40. }
  41. public async Task<HttpResponseMessage> GetAsync(string api, Dictionary<string,string> parmas)
  42. {
  43. System.Net.Http.HttpClient httpClient = await GetHttpClient(null,parmas);
  44. return await httpClient.GetAsync(api);
  45. }
  46. public async Task<HttpResponseMessage> PostAsync(string api, StringContent? parmaJson)
  47. {
  48. System.Net.Http.HttpClient httpClient = await GetHttpClient(parmaJson, null);
  49. return await httpClient.PostAsync(api, parmaJson);
  50. }
  51. public async Task<HttpResponseMessage> PutAsync(string api, StringContent? parmaJson)
  52. {
  53. System.Net.Http.HttpClient httpClient = await GetHttpClient(parmaJson, null);
  54. return await httpClient.PutAsync(api, parmaJson);
  55. }
  56. public async Task<HttpResponseMessage> DeleteAsync(string api, StringContent? parmaJson)
  57. {
  58. System.Net.Http.HttpClient httpClient = await GetHttpClient(parmaJson, null);
  59. HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Delete, api);
  60. httpRequestMessage.Content = parmaJson;
  61. return await httpClient.SendAsync(httpRequestMessage);
  62. }
  63. private async Task<System.Net.Http.HttpClient> GetHttpClient(StringContent? parmaJson, Dictionary<string, string>? parmas)
  64. {
  65. string nonceStr = GenerateUniqueString();
  66. string timeStampStr = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
  67. var httpClient = _httpContextFactory.CreateClient();
  68. httpClient.BaseAddress = new Uri(baseUrl);
  69. httpClient.DefaultRequestHeaders.Add("sign_method", signMethod);
  70. httpClient.DefaultRequestHeaders.Add("secret_id", secretId);
  71. httpClient.DefaultRequestHeaders.Add("nonce", nonceStr);
  72. httpClient.DefaultRequestHeaders.Add("timestamp", timeStampStr);
  73. httpClient.DefaultRequestHeaders.Add("CurrentBuId", buildId);
  74. if (parmaJson != null)
  75. {
  76. string json = await parmaJson.ReadAsStringAsync();
  77. httpClient.DefaultRequestHeaders.Add("signature", SignStr(nonceStr, timeStampStr, json, null));
  78. }
  79. else
  80. {
  81. httpClient.DefaultRequestHeaders.Add("signature", SignStr(nonceStr, timeStampStr, null, parmas));
  82. }
  83. return httpClient;
  84. }
  85. private string GenerateUniqueString()
  86. {
  87. // 生成 GUID 并去掉 "-"
  88. string guid = Guid.NewGuid().ToString("N");
  89. // 截取前 7 位
  90. return guid.Substring(0, 7);
  91. }
  92. private string SignStr(string nonce,string timestamp, string? parmaJson,Dictionary<string,string>? parmas)
  93. {
  94. string sign = $"sign_method={signMethod}&secret_id={secretId}&nonce={nonce}&timestamp={timestamp}";
  95. if(parmaJson != null)
  96. {
  97. sign += $"&{parmaJson}";
  98. }
  99. if (parmas != null)
  100. {
  101. foreach (var item in parmas)
  102. {
  103. sign += $"&{item.Key}={item.Value}";
  104. }
  105. }
  106. string encrySign = sign.SM4Encrypt_ECB(acesskey);
  107. byte[] encrySignBytes = Encoding.UTF8.GetBytes(encrySign);
  108. string encryBase64 = Convert.ToBase64String(encrySignBytes);
  109. return encryBase64;
  110. }
  111. }
  112. }