HttpService.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. using DBEntity;
  2. using IvfTl.Control.Entity.DTO;
  3. using IvfTl.Control.Entity.DTO.ApiResutlDatas;
  4. using IvfTl.Control.Entity.GlobalEntitys;
  5. using IvfTl.Control.Entity.GlobalEnums;
  6. using Newtonsoft.Json;
  7. using System.Net;
  8. using System.Net.Http;
  9. using System.Net.Http.Headers;
  10. using System.Security.Principal;
  11. using System.Text;
  12. namespace IvfTl.Control.Services.HttpServices
  13. {
  14. public class HttpService
  15. {
  16. public event Action<string, LogEnum> ErrorLogEvent;
  17. public event Action<Exception, string, string, LogEnum> ExceptionLogEvent;
  18. private string token = null;
  19. private string account = null;
  20. private string passWord = null;
  21. private HttpClient client = null;
  22. //我这边超时
  23. private TimeSpan AsyncTimeout = new TimeSpan(0, 0, 10);
  24. //服务器超时
  25. TimeSpan ServiceTimeout = new TimeSpan(0, 0, 12);
  26. public HttpService(string baseAddress)
  27. {
  28. client = new HttpClient()
  29. {
  30. BaseAddress = new Uri(baseAddress),
  31. Timeout = ServiceTimeout
  32. };
  33. client.DefaultRequestHeaders.ExpectContinue = false;
  34. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  35. }
  36. private void ExLog(Exception ex, string name)
  37. {
  38. ExceptionLogEvent?.Invoke(ex, $"HttpService.{name}", null, LogEnum.RunException);
  39. }
  40. private void ErrorLog(string message, LogEnum logType)
  41. {
  42. ErrorLogEvent?.Invoke($"HttpService.{message}", logType);
  43. }
  44. public void AlarmApi(string tlSn, int houseSn, int wellSn, string alarmTypeKey, List<string> paramList)
  45. {
  46. string funcName = "AlarmApi";
  47. try
  48. {
  49. string url = "/api/tl/control/alarm/reportCloudAlarm";
  50. string body = JsonConvert.SerializeObject(new
  51. {
  52. tlSn = tlSn,
  53. alarmTypeKey = alarmTypeKey,
  54. paramList = paramList,
  55. houseSn,
  56. wellSn
  57. });
  58. string rsString = callWebService(url, body);
  59. if (string.IsNullOrEmpty(rsString)) return;
  60. var result = JsonConvert.DeserializeObject<HttpResult>(rsString);
  61. if (!result.success)
  62. {
  63. ErrorLog($"{funcName}服务器返回失败:{rsString}", LogEnum.RunError);
  64. return;
  65. }
  66. return;
  67. }
  68. catch (Exception ex)
  69. {
  70. ExLog(ex, "Login");
  71. return;
  72. }
  73. }
  74. public void AlarmApi1(string tlSn, string alarmTypeKey, List<string> paramList)
  75. {
  76. string funcName = "AlarmApi1";
  77. try
  78. {
  79. string url = "/api/tl/control/alarm/reportCloudAlarm";
  80. string body = JsonConvert.SerializeObject(new
  81. {
  82. tlSn = tlSn,
  83. alarmTypeKey = alarmTypeKey,
  84. paramList = paramList,
  85. });
  86. string rsString = callWebService(url, body);
  87. if (string.IsNullOrEmpty(rsString)) return;
  88. var result = JsonConvert.DeserializeObject<HttpResult>(rsString);
  89. if (!result.success)
  90. {
  91. ErrorLog($"{funcName}服务器返回失败:{rsString}", LogEnum.RunError);
  92. return;
  93. }
  94. return;
  95. }
  96. catch (Exception ex)
  97. {
  98. ExLog(ex, "Login");
  99. return;
  100. }
  101. }
  102. #region 基础操作
  103. public UserInfo Login(string _account, string _passWord)
  104. {
  105. string funcName = "Login";
  106. try
  107. {
  108. account = _account;
  109. passWord = _passWord;
  110. string json = callWebServiceNoToken("/api/gateway/auth/login", JsonConvert.SerializeObject(new { account = account, password = passWord }));
  111. if (string.IsNullOrEmpty(json)) return null;
  112. var result = JsonConvert.DeserializeObject<HttpResult<LoginResultData>>(json);
  113. if (!result.success)
  114. {
  115. ErrorLog($"{funcName}服务器返回失败:{json}", LogEnum.RunError);
  116. token = null;
  117. return null;
  118. }
  119. if (result.data != null)
  120. {
  121. token = result.data.token;
  122. return result.data.userInfo;
  123. }
  124. ErrorLog($"{funcName}接口返回成功但是无数据 {json}", LogEnum.RunError);
  125. token = null;
  126. return null;
  127. }
  128. catch (Exception ex)
  129. {
  130. ExLog(ex, "Login");
  131. token = null;
  132. return null;
  133. }
  134. }
  135. public string GetToken()
  136. {
  137. string funcName = "GetToken";
  138. try
  139. {
  140. if (!string.IsNullOrEmpty(token)) return token;
  141. string json = callWebServiceNoToken("/api/gateway/auth/login", JsonConvert.SerializeObject(new { account = account, password = passWord }));
  142. if (string.IsNullOrEmpty(json)) return null;
  143. var result = JsonConvert.DeserializeObject<HttpResult<LoginResultData>>(json);
  144. if (!result.success)
  145. {
  146. ErrorLog($"{funcName}服务器返回失败:{json}", LogEnum.RunError);
  147. token = null;
  148. return null;
  149. }
  150. if (result.data != null)
  151. {
  152. token = result.data.token;
  153. return token;
  154. }
  155. ErrorLog($"{funcName}返回成功但是无数据 {json}", LogEnum.RunError);
  156. token = null;
  157. return token;
  158. }
  159. catch (Exception ex)
  160. {
  161. ExLog(ex, funcName);
  162. token = null;
  163. return null;
  164. }
  165. }
  166. public string callWebService(string url)
  167. {
  168. try
  169. {
  170. if (string.IsNullOrEmpty(GetToken())) return null;
  171. using var requestNew = new HttpRequestMessage(HttpMethod.Post, url);
  172. requestNew.Headers.Add("token", token);
  173. return HttpClientSendAsync(requestNew, url).ConfigureAwait(false).GetAwaiter().GetResult();
  174. }
  175. catch (Exception ex)
  176. {
  177. ExceptionLogEvent?.Invoke(ex, $"访问服务器异常:[url:{url}]", null, LogEnum.RunException);
  178. return null;
  179. }
  180. }
  181. public string callWebService(string url, string body)
  182. {
  183. try
  184. {
  185. if (string.IsNullOrEmpty(GetToken())) return null;
  186. using var requestNew = new HttpRequestMessage(HttpMethod.Post, url);
  187. using HttpContent httpContent1 = new StringContent(body, Encoding.UTF8, "application/json");
  188. requestNew.Content = httpContent1;
  189. requestNew.Headers.Add("token", token);
  190. return HttpClientSendAsync(requestNew, url).ConfigureAwait(false).GetAwaiter().GetResult();
  191. }
  192. catch (Exception ex)
  193. {
  194. ExceptionLogEvent?.Invoke(ex, $"访问服务器异常:[url:{url}],body:{body}", null, LogEnum.RunException);
  195. return null;
  196. }
  197. }
  198. public string callWebServiceSteam(string url, string body)
  199. {
  200. try
  201. {
  202. if (string.IsNullOrEmpty(GetToken())) return null;
  203. using var requestNew = new HttpRequestMessage(HttpMethod.Post, url);
  204. using HttpContent httpContent1 = new StringContent(body, Encoding.UTF8, "application/json");
  205. requestNew.Content = httpContent1;
  206. requestNew.Headers.Add("token", token);
  207. return HttpClientSendAsyncStream(requestNew, url).ConfigureAwait(false).GetAwaiter().GetResult();
  208. }
  209. catch (Exception ex)
  210. {
  211. ExceptionLogEvent?.Invoke(ex, $"访问服务器异常:[url:{url}],body:{body}", null, LogEnum.RunException);
  212. return null;
  213. }
  214. }
  215. public string callWebService(string url, Dictionary<string, string> body)
  216. {
  217. try
  218. {
  219. if (string.IsNullOrEmpty(GetToken())) return null;
  220. using var requestNew = new HttpRequestMessage(HttpMethod.Post, url);
  221. using HttpContent httpContent1 = new FormUrlEncodedContent(body);
  222. requestNew.Content = httpContent1;
  223. requestNew.Headers.Add("token", token);
  224. return HttpClientSendAsync(requestNew, url).ConfigureAwait(false).GetAwaiter().GetResult();
  225. }
  226. catch (Exception ex)
  227. {
  228. ExceptionLogEvent?.Invoke(ex, $"访问服务器异常:[url:{url}],body:{JsonConvert.SerializeObject(body)}", null, LogEnum.RunException);
  229. return null;
  230. }
  231. }
  232. public string callWebServiceNoToken(string url, string body)
  233. {
  234. try
  235. {
  236. using var requestNew = new HttpRequestMessage(HttpMethod.Post, url);
  237. using HttpContent httpContent1 = new StringContent(body, Encoding.UTF8, "application/json");
  238. requestNew.Content = httpContent1;
  239. return HttpClientSendAsync(requestNew, url).ConfigureAwait(false).GetAwaiter().GetResult();
  240. }
  241. catch (Exception ex)
  242. {
  243. ExceptionLogEvent?.Invoke(ex, $"访问服务器异常:[url:{url}],body:{body}", null, LogEnum.RunException);
  244. return null;
  245. }
  246. }
  247. public async Task<string> HttpClientSendAsync(HttpRequestMessage request, string url)
  248. {
  249. string traceId = Guid.NewGuid().ToString("N");
  250. using var cts = new CancellationTokenSource(AsyncTimeout);
  251. try
  252. {
  253. request.Headers.Add("traceId", traceId);
  254. using var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cts.Token).ConfigureAwait(false);
  255. if (!response.IsSuccessStatusCode)
  256. {
  257. ErrorLogEvent?.Invoke($"HttpClientSendAsync访问服务器失败 [url:{url}],[TraceID:{traceId}][code:{response.StatusCode}]", LogEnum.RunError);
  258. return null;
  259. }
  260. return response.Content.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult();
  261. }
  262. catch (TaskCanceledException ex) when (cts.IsCancellationRequested)
  263. {
  264. ErrorLogEvent?.Invoke($"HttpClientSendAsync请求超时 [url:{url}],[TraceID:{traceId}]", LogEnum.RunError);
  265. return null;
  266. }
  267. catch (HttpRequestException ex)
  268. {
  269. ExceptionLogEvent?.Invoke(ex, $"HttpClientSendAsync网络异常 [url:{url}],[TraceID:{traceId}]", null, LogEnum.RunException);
  270. return null;
  271. }
  272. catch (Exception ex)
  273. {
  274. ExceptionLogEvent?.Invoke(ex, $"HttpClientSendAsync访问服务器异常:[url:{url}],[traceId:{traceId}],", null, LogEnum.RunException);
  275. return null;
  276. }
  277. }
  278. public async Task<string> HttpClientSendAsyncStream(HttpRequestMessage request, string url)
  279. {
  280. string result = string.Empty;
  281. string traceId = Guid.NewGuid().ToString("N");
  282. using var cts = new CancellationTokenSource(AsyncTimeout);
  283. try
  284. {
  285. request.Headers.Add("traceId", traceId);
  286. using var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cts.Token).ConfigureAwait(false);
  287. if (!response.IsSuccessStatusCode)
  288. {
  289. ErrorLogEvent?.Invoke($"HttpClientSendAsyncStream访问服务器失败 [url:{url}],[TraceID:{traceId}][code:{response.StatusCode}]", LogEnum.RunError);
  290. return null;
  291. }
  292. var buffer = new char[4096];
  293. int bytesRead;
  294. var StringBuilderResult = new StringBuilder();
  295. using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
  296. {
  297. using (var reader = new StreamReader(stream, Encoding.UTF8))
  298. {
  299. while ((bytesRead = await reader.ReadAsync(buffer).ConfigureAwait(false)) > 0)
  300. {
  301. StringBuilderResult.Append(buffer, 0, bytesRead);
  302. }
  303. }
  304. }
  305. result = StringBuilderResult.ToString();
  306. StringBuilderResult.Clear();
  307. return result;
  308. }
  309. catch (TaskCanceledException ex) when (cts.IsCancellationRequested)
  310. {
  311. ErrorLogEvent?.Invoke($"HttpClientSendAsyncStream请求超时 [url:{url}],[TraceID:{traceId}]", LogEnum.RunError);
  312. return null;
  313. }
  314. catch (HttpRequestException ex)
  315. {
  316. ExceptionLogEvent?.Invoke(ex, $"HttpClientSendAsyncStream网络异常 [url:{url}],[TraceID:{traceId}]", null, LogEnum.RunException);
  317. return null;
  318. }
  319. catch (Exception ex)
  320. {
  321. ExceptionLogEvent?.Invoke(ex, $"HttpClientSendAsyncStream访问服务器异常:[url:{url}],[traceId:{traceId}],", null, LogEnum.RunException);
  322. return null;
  323. }
  324. }
  325. #endregion
  326. }
  327. }