XFApiService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. BundlesService _bundlesService;
  19. public XFApiService(BundlesService bundlesService, XFDbContext context, ILoggerFactory loggerFactory):base(context, loggerFactory)
  20. {
  21. _bundlesService = bundlesService;
  22. }
  23. /// <summary>
  24. /// 提交信件
  25. /// </summary>
  26. /// <param name="b">信件内容</param>
  27. /// <param name="onFails">失败回调</param>
  28. /// <returns></returns>
  29. public async Task<bool> PostLetter(Bundle b, string absoluteUri, OnFails onFails)
  30. {
  31. string d = b.Describe;
  32. if (b.Assets.Count() > 0)
  33. d += "(此信件内容含有其他多媒体信息,详细请复制网址到浏览器打开:" + _bundlesService.GenerateBaseURL(b, absoluteUri) + ")";
  34. string s = "advice={0};type={1};name={2};phone={3};is_public={4};content={5};title={6};county_id={7};unit_id={8};sswz=8;ly=2; user_id={9}";
  35. s = String.Format(s, b.Advice, b.Type.ToString(), b.Name, b.Mobile, b.IsPublic.ToString(), d, b.Title, b.County_id, b.Unit_id, b.OpenID);
  36. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://118.178.118.50/test1/letter/submitLetter;", s, onFails);
  37. if (rObj == null)
  38. return false;
  39. if (rObj.Data == null || !rObj.Data.Success)
  40. {
  41. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  42. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  43. return false;
  44. }
  45. b.SearchCode = rObj.Data.Data;
  46. _bundlesService.Update(b);
  47. return true;
  48. //if (rObj != null)
  49. //{
  50. // b.SearchCode = rObj.Data.Data;
  51. // return true;
  52. //}
  53. //return false;
  54. }
  55. /// <summary>
  56. /// 查询码是否有效
  57. /// </summary>
  58. /// <param name="queryCode">查询码</param>
  59. /// <param name="onFails">失败回调</param>
  60. /// <returns></returns>
  61. public async Task<bool> QueryCodeIsValid(string queryCode, OnFails onFails)
  62. {
  63. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/code;", "query_code=" + queryCode, onFails);
  64. if (rObj == null)
  65. return false;
  66. if (rObj.Data == null || !rObj.Data.Success)
  67. {
  68. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  69. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  70. return false;
  71. }
  72. return true;
  73. }
  74. /// <summary>
  75. /// 查询信件详细信息
  76. /// </summary>
  77. /// <param name="queryCode">查询码</param>
  78. /// <param name="onFails">失败回调</param>
  79. /// <returns></returns>
  80. public async Task<Bundle> GetBundleByQueryCode(string queryCode, OnFails onFails)
  81. {
  82. XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/letterDetail;", "query_code="+ queryCode, onFails);
  83. if (rObj == null)
  84. return null;
  85. if (rObj.Data == null || !rObj.Data.Success)
  86. {
  87. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  88. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  89. return null;
  90. }
  91. Bundle bundle = new Bundle();
  92. return bundle;
  93. }
  94. /// <summary>
  95. /// 是否可评价
  96. /// </summary>
  97. /// <param name="letter_id"></param>
  98. /// <param name="onFails"></param>
  99. /// <returns></returns>
  100. public async Task<bool> IsEvaluate(string letter_id, OnFails onFails)
  101. {
  102. XFApiIsEvaluateResult rObj = await HttpPostAsync<XFApiIsEvaluateResult>("http://<服务器IP>/query/letterDetail;", "letter_id=" + letter_id, onFails);
  103. if (rObj == null)
  104. return false;
  105. if (rObj.Data == null)
  106. {
  107. Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  108. onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  109. return false;
  110. }
  111. return rObj.Data.SFKPJ;
  112. }
  113. /// <summary>
  114. /// 评价
  115. /// </summary>
  116. /// <param name="e"></param>
  117. /// <param name="onFails"></param>
  118. /// <returns></returns>
  119. //http://<服务器IP>/query/submitEvaluate
  120. public async Task<bool> SubmitEvaluate(EvaluateModel e, OnFails onFails)
  121. {
  122. //Dictionary<string, string> d = e.ToDictionary();
  123. //XFApiResult rObj = await HttpPostAsync<XFApiResult>("http://<服务器IP>/query/letterDetail", d, onFails);
  124. //if (rObj == null)
  125. // return false;
  126. //if (rObj.Data == null || !rObj.Data.Success)
  127. //{
  128. // Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
  129. // onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
  130. // return false;
  131. //}
  132. return true;
  133. }
  134. /// <summary>
  135. /// POST 异步
  136. /// </summary>
  137. /// <param name="url"></param>
  138. /// <param name="postStream"></param>
  139. /// <param name="encoding"></param>
  140. /// <param name="timeOut"></param>
  141. /// <returns></returns>
  142. async Task<T> HttpPostAsync<T>(string url, string formData, OnFails onFails)
  143. {
  144. HttpClientHandler handler = new HttpClientHandler();
  145. HttpClient client = new HttpClient(handler);
  146. MemoryStream ms = new MemoryStream();
  147. HttpContent hc = new StreamContent(ms);
  148. hc.Headers.Add("APIKey", "MUA5NmU3OTIxOEPSOFTDQ1YTMzMDExMg");
  149. var r = await client.PostAsync(url + WebUtility.UrlEncode(formData), hc);
  150. if (r.StatusCode != HttpStatusCode.OK)
  151. {
  152. Logger.LogError("省统一平台异常反馈:状态“{0}”", r.StatusCode);
  153. onFails(string.Format("省统一平台异常反馈:状态“{0}”", r.StatusCode));
  154. return default(T);
  155. }
  156. byte[] tmp = await r.Content.ReadAsByteArrayAsync();
  157. string rStr = Encoding.UTF8.GetString(tmp);
  158. T rObj = JsonConvert.DeserializeObject<T>(rStr);
  159. if (rObj == null)
  160. {
  161. Logger.LogError("数据提交省统一平台失败,原因:{0}", "数据为空");
  162. onFails(string.Format("数据提交省统一平台失败,原因:{0}", "数据为空"));
  163. return default(T);
  164. }
  165. return rObj;
  166. }
  167. /// <summary>
  168. /// POST 同步
  169. /// </summary>
  170. /// <param name="url"></param>
  171. /// <param name="postStream"></param>
  172. /// <param name="encoding"></param>
  173. /// <param name="timeOut"></param>
  174. /// <returns></returns>
  175. string HttpPost(string url, Dictionary<string, string> formData = null, Encoding encoding = null, int timeOut = 10000)
  176. {
  177. HttpClientHandler handler = new HttpClientHandler();
  178. HttpClient client = new HttpClient(handler);
  179. MemoryStream ms = new MemoryStream();
  180. FillFormDataStream(formData, ms);//填充formData
  181. HttpContent hc = new StreamContent(ms);
  182. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
  183. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xhtml+xml"));
  184. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml", 0.9));
  185. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/webp"));
  186. //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*", 0.8));
  187. //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");
  188. //hc.Headers.Add("Timeout", timeOut.ToString());
  189. //hc.Headers.Add("KeepAlive", "true");
  190. var t = client.PostAsync(url, hc);
  191. t.Wait();
  192. var t2 = t.Result.Content.ReadAsByteArrayAsync();
  193. return encoding.GetString(t2.Result);
  194. }
  195. /// <summary>
  196. /// 组装QueryString的方法
  197. /// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3
  198. /// </summary>
  199. /// <param name="formData"></param>
  200. /// <returns></returns>
  201. string GetQueryString(Dictionary<string, string> formData)
  202. {
  203. if (formData == null || formData.Count == 0)
  204. {
  205. return "";
  206. }
  207. StringBuilder sb = new StringBuilder();
  208. var i = 0;
  209. foreach (var kv in formData)
  210. {
  211. i++;
  212. sb.AppendFormat("{0}={1}", kv.Key, kv.Value);
  213. if (i < formData.Count)
  214. {
  215. sb.Append("&");
  216. }
  217. }
  218. return sb.ToString();
  219. }
  220. /// <summary>
  221. /// 填充表单信息的Stream
  222. /// </summary>
  223. /// <param name="formData"></param>
  224. /// <param name="stream"></param>
  225. void FillFormDataStream(Dictionary<string, string> formData, Stream stream)
  226. {
  227. string dataString = GetQueryString(formData);
  228. var formDataBytes = formData == null ? new byte[0] : Encoding.UTF8.GetBytes(dataString);
  229. stream.Write(formDataBytes, 0, formDataBytes.Length);
  230. stream.Seek(0, SeekOrigin.Begin);//设置指针读取位置
  231. }
  232. }
  233. }