XFApiService.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Winsoft.GOV.XF.WebApi.WXCore.Models;
  9. using Newtonsoft.Json;
  10. using Winsoft.GOV.XF.WebApi.WXCore.Data;
  11. using Microsoft.Extensions.Logging;
  12. using System.Net;
  13. namespace Winsoft.GOV.XF.WebApi.WXCore.Services
  14. {
  15. public class XFApiService : BaseService
  16. {
  17. public delegate void OnFails(string message);
  18. public XFApiService(XFDbContext context, ILoggerFactory loggerFactory):base(context, loggerFactory)
  19. {
  20. }
  21. /// <summary>
  22. /// 提交信件
  23. /// </summary>
  24. /// <param name="b">信件内容</param>
  25. /// <param name="onFails">失败回调</param>
  26. /// <returns></returns>
  27. public async Task<bool> PostLetter(Bundle b, OnFails onFails)
  28. {
  29. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://118.178.118.50/test1/letter/submitLetter", b.ToDictionary(), onFails);
  30. if (rObj == null)
  31. return false;
  32. if (rObj.Data == null || !rObj.Data.Success)
  33. {
  34. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  35. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  36. return false;
  37. }
  38. return true;
  39. //if (rObj != null)
  40. //{
  41. // b.SearchCode = rObj.Data.Data;
  42. // return true;
  43. //}
  44. //return false;
  45. }
  46. /// <summary>
  47. /// 查询码是否有效
  48. /// </summary>
  49. /// <param name="queryCode">查询码</param>
  50. /// <param name="onFails">失败回调</param>
  51. /// <returns></returns>
  52. public async Task<bool> QueryCodeIsValid(string queryCode, OnFails onFails)
  53. {
  54. Dictionary<string, string> d = new Dictionary<string, string>();
  55. d.Add("query_code", queryCode);
  56. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/code", d, onFails);
  57. if (rObj == null)
  58. return false;
  59. if (rObj.Data == null || !rObj.Data.Success)
  60. {
  61. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  62. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  63. return false;
  64. }
  65. return true;
  66. }
  67. /// <summary>
  68. /// 查询信件详细信息
  69. /// </summary>
  70. /// <param name="queryCode">查询码</param>
  71. /// <param name="onFails">失败回调</param>
  72. /// <returns></returns>
  73. public async Task<Bundle> GetBundleByQueryCode(string queryCode, OnFails onFails)
  74. {
  75. Dictionary<string, string> d = new Dictionary<string, string>();
  76. d.Add("query_code", queryCode);
  77. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/letterDetail", d, onFails);
  78. if (rObj == null)
  79. return null;
  80. if (rObj.Data == null || !rObj.Data.Success)
  81. {
  82. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  83. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  84. return null;
  85. }
  86. Bundle bundle = new Bundle();
  87. return bundle;
  88. }
  89. public async Task<bool> IsEvaluate(string letter_id, OnFails onFails)
  90. {
  91. Dictionary<string, string> d = new Dictionary<string, string>();
  92. d.Add("letter_id", letter_id);
  93. XFApiIsEvaluateResult rObj = await HttpPostAsync<XFApiIsEvaluateResult>("http://<服务器IP>/query/letterDetail", d, onFails);
  94. if (rObj == null)
  95. return false;
  96. if (rObj.Data == null)
  97. {
  98. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  99. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  100. return false;
  101. }
  102. return rObj.Data.SFKPJ;
  103. }
  104. //http://<服务器IP>/query/submitEvaluate
  105. public async Task<bool> SubmitEvaluate(EvaluateModel e, OnFails onFails)
  106. {
  107. Dictionary<string, string> d = e.ToDictionary();
  108. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/letterDetail", d, onFails);
  109. if (rObj == null)
  110. return false;
  111. if (rObj.Data == null || !rObj.Data.Success)
  112. {
  113. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  114. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  115. return false;
  116. }
  117. return true;
  118. }
  119. /// <summary>
  120. /// POST 异步
  121. /// </summary>
  122. /// <param name="url"></param>
  123. /// <param name="postStream"></param>
  124. /// <param name="encoding"></param>
  125. /// <param name="timeOut"></param>
  126. /// <returns></returns>
  127. async Task<T> HttpPostAsync<T>(string url, Dictionary<string, string> formData, OnFails onFails)
  128. {
  129. HttpClientHandler handler = new HttpClientHandler();
  130. HttpClient client = new HttpClient(handler);
  131. MemoryStream ms = new MemoryStream();
  132. FillFormDataStream(formData, ms);//填充formData
  133. HttpContent hc = new StreamContent(ms);
  134. hc.Headers.Add("APIKey", "MUA5NmU3OTIxOEPSOFTDQ1YTMzMDExMg");
  135. var r = await client.PostAsync(url, hc);
  136. if (r.StatusCode != HttpStatusCode.OK)
  137. {
  138. Logger.LogError("省统一平台异常反馈:状态“{0}”", r.StatusCode);
  139. onFails(string.Format("省统一平台异常反馈:状态“{0}”", r.StatusCode));
  140. return default(T);
  141. }
  142. byte[] tmp = await r.Content.ReadAsByteArrayAsync();
  143. string rStr = Encoding.UTF8.GetString(tmp);
  144. T rObj = JsonConvert.DeserializeObject<T>(rStr);
  145. if (rObj == null)
  146. {
  147. Logger.LogError("数据提交省统一平台失败,原因:{0}", "数据为空");
  148. onFails(string.Format("数据提交省统一平台失败,原因:{0}", "数据为空"));
  149. return default(T);
  150. }
  151. return rObj;
  152. }
  153. /// <summary>
  154. /// POST 同步
  155. /// </summary>
  156. /// <param name="url"></param>
  157. /// <param name="postStream"></param>
  158. /// <param name="encoding"></param>
  159. /// <param name="timeOut"></param>
  160. /// <returns></returns>
  161. string HttpPost(string url, Dictionary<string, string> formData = null, Encoding encoding = null, int timeOut = 10000)
  162. {
  163. HttpClientHandler handler = new HttpClientHandler();
  164. HttpClient client = new HttpClient(handler);
  165. MemoryStream ms = new MemoryStream();
  166. FillFormDataStream(formData, ms);//填充formData
  167. HttpContent hc = new StreamContent(ms);
  168. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
  169. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xhtml+xml"));
  170. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml", 0.9));
  171. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/webp"));
  172. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*", 0.8));
  173. //hc.Headers.Add("UserAgent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
  174. //hc.Headers.Add("Timeout", timeOut.ToString());
  175. //hc.Headers.Add("KeepAlive", "true");
  176. var t = client.PostAsync(url, hc);
  177. t.Wait();
  178. var t2 = t.Result.Content.ReadAsByteArrayAsync();
  179. return encoding.GetString(t2.Result);
  180. }
  181. /// <summary>
  182. /// 组装QueryString的方法
  183. /// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3
  184. /// </summary>
  185. /// <param name="formData"></param>
  186. /// <returns></returns>
  187. string GetQueryString(Dictionary<string, string> formData)
  188. {
  189. if (formData == null || formData.Count == 0)
  190. {
  191. return "";
  192. }
  193. StringBuilder sb = new StringBuilder();
  194. var i = 0;
  195. foreach (var kv in formData)
  196. {
  197. i++;
  198. sb.AppendFormat("{0}={1}", kv.Key, kv.Value);
  199. if (i < formData.Count)
  200. {
  201. sb.Append("&");
  202. }
  203. }
  204. return sb.ToString();
  205. }
  206. /// <summary>
  207. /// 填充表单信息的Stream
  208. /// </summary>
  209. /// <param name="formData"></param>
  210. /// <param name="stream"></param>
  211. void FillFormDataStream(Dictionary<string, string> formData, Stream stream)
  212. {
  213. string dataString = GetQueryString(formData);
  214. var formDataBytes = formData == null ? new byte[0] : Encoding.UTF8.GetBytes(dataString);
  215. stream.Write(formDataBytes, 0, formDataBytes.Length);
  216. stream.Seek(0, SeekOrigin.Begin);//设置指针读取位置
  217. }
  218. }
  219. }