WebExtension.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using Masuit.Tools.Core.Config;
  2. using Masuit.Tools.Models;
  3. using Microsoft.AspNetCore.Http;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Net.Http;
  9. using System.Threading.Tasks;
  10. namespace Masuit.Tools.Core.Net
  11. {
  12. /// <summary>
  13. /// Web操作扩展
  14. /// </summary>
  15. public static class WebExtension
  16. {
  17. #region 获取线程内唯一的EF上下文对象
  18. /// <summary>
  19. /// 获取线程内唯一的EF上下文对象,.NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码:
  20. /// <para>public static DataContext GetDbContext()</para>
  21. /// <para>{</para>
  22. /// <para> DataContext db;</para>
  23. /// <para> if (CallContext&lt;DataContext>.GetData("db") is null)</para>
  24. /// <para> {</para>
  25. /// <para> DbContextOptions&lt;DataContext> dbContextOption = new DbContextOptions&lt;DataContext>();</para>
  26. /// <para> DbContextOptionsBuilder&lt;DataContext> dbContextOptionBuilder = new DbContextOptionsBuilder&lt;DataContext>(dbContextOption);</para>
  27. /// <para> db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options);</para>
  28. /// <para> CallContext&lt;DataContext>.SetData("db", db);</para>
  29. /// <para> }</para>
  30. /// <para> db = CallContext&lt;DataContext>.GetData("db");</para>
  31. /// <para> return db;</para>
  32. /// <para>}</para>
  33. /// </summary>
  34. /// <typeparam name="T">EF上下文容器对象</typeparam>
  35. /// <returns>EF上下文容器对象</returns>
  36. [Obsolete(@".NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码:
  37. public static DataContext GetDbContext()
  38. {
  39. DataContext db;
  40. if (CallContext<DataContext>.GetData(""db"") is null)
  41. {
  42. DbContextOptions<DataContext> dbContextOption = new DbContextOptions<DataContext>();
  43. DbContextOptionsBuilder<DataContext> dbContextOptionBuilder = new DbContextOptionsBuilder<DataContext>(dbContextOption);
  44. db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options);
  45. CallContext<DataContext>.SetData(""db"", db);
  46. }
  47. db = CallContext<DataContext>.GetData(""db"");
  48. return db;
  49. }")]
  50. public static T GetDbContext<T>() where T : new()
  51. {
  52. throw new Exception(@".NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码:
  53. public static DataContext GetDbContext()
  54. {
  55. DataContext db;
  56. if (CallContext<DataContext>.GetData(""db"") is null)
  57. {
  58. DbContextOptions<DataContext> dbContextOption = new DbContextOptions<DataContext>();
  59. DbContextOptionsBuilder<DataContext> dbContextOptionBuilder = new DbContextOptionsBuilder<DataContext>(dbContextOption);
  60. db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options);
  61. CallContext<DataContext>.SetData(""db"", db);
  62. }
  63. db = CallContext<DataContext>.GetData(""db"");
  64. return db;
  65. }
  66. ");
  67. }
  68. #endregion
  69. #region 获取客户端IP地址信息
  70. /// <summary>
  71. /// 根据IP地址获取详细地理信息
  72. /// </summary>
  73. /// <param name="ip"></param>
  74. /// <returns></returns>
  75. public static async Task<Tuple<string, List<string>>> GetIPAddressInfo(this string ip)
  76. {
  77. ip.MatchInetAddress(out var isIpAddress);
  78. if (isIpAddress)
  79. {
  80. var address = await GetPhysicsAddressInfo(ip);
  81. if (address.Status == 0)
  82. {
  83. string detail = $"{address.AddressResult.FormattedAddress} {address.AddressResult.AddressComponent.Direction}{address.AddressResult.AddressComponent.Distance ?? "0"}米";
  84. List<string> pois = address.AddressResult.Pois.Select(p => $"{p.AddressDetail}{p.Name} {p.Direction}{p.Distance ?? "0"}米").ToList();
  85. return new Tuple<string, List<string>>(detail, pois);
  86. }
  87. return new Tuple<string, List<string>>("IP地址不正确", new List<string>());
  88. }
  89. return new Tuple<string, List<string>>($"{ip}不是一个合法的IP地址", new List<string>());
  90. }
  91. /// <summary>
  92. /// 根据IP地址获取详细地理信息对象
  93. /// </summary>
  94. /// <param name="ip"></param>
  95. /// <returns></returns>
  96. public static async Task<PhysicsAddress> GetPhysicsAddressInfo(this string ip)
  97. {
  98. ip.MatchInetAddress(out var isIpAddress);
  99. if (isIpAddress)
  100. {
  101. string ak = CoreConfig.Configuration["BaiduAK"];
  102. if (string.IsNullOrEmpty(ak))
  103. {
  104. throw new Exception("未配置BaiduAK,请先在您的应用程序appsettings.json中下添加BaiduAK配置节(注意大小写)");
  105. }
  106. using (HttpClient client = new HttpClient() { BaseAddress = new Uri("http://api.map.baidu.com") })
  107. {
  108. client.DefaultRequestHeaders.Referrer = new Uri("http://lbsyun.baidu.com/jsdemo.htm");
  109. var task = client.GetAsync($"/location/ip?ak={ak}&ip={ip}&coor=bd09ll").ContinueWith(async t =>
  110. {
  111. if (t.IsFaulted || t.IsCanceled)
  112. {
  113. return null;
  114. }
  115. var res = await t;
  116. if (res.IsSuccessStatusCode)
  117. {
  118. var ipAddress = JsonConvert.DeserializeObject<BaiduIP>(await res.Content.ReadAsStringAsync());
  119. if (ipAddress.Status == 0)
  120. {
  121. LatiLongitude point = ipAddress.AddressInfo.LatiLongitude;
  122. string result = client.GetStringAsync($"/geocoder/v2/?location={point.Y},{point.X}&output=json&pois=1&radius=1000&latest_admin=1&coordtype=bd09ll&ak={ak}").Result;
  123. PhysicsAddress address = JsonConvert.DeserializeObject<PhysicsAddress>(result);
  124. if (address.Status == 0)
  125. {
  126. return address;
  127. }
  128. }
  129. else
  130. {
  131. using (var client2 = new HttpClient { BaseAddress = new Uri("http://ip.taobao.com") })
  132. {
  133. return await await client2.GetAsync($"/service/getIpInfo.php?ip={ip}").ContinueWith(async tt =>
  134. {
  135. if (tt.IsFaulted || tt.IsCanceled)
  136. {
  137. return null;
  138. }
  139. var result = await tt;
  140. if (result.IsSuccessStatusCode)
  141. {
  142. TaobaoIP taobaoIp = JsonConvert.DeserializeObject<TaobaoIP>(await result.Content.ReadAsStringAsync());
  143. if (taobaoIp.Code == 0)
  144. {
  145. return new PhysicsAddress()
  146. {
  147. Status = 0,
  148. AddressResult = new AddressResult()
  149. {
  150. FormattedAddress = taobaoIp.IpData.Country + taobaoIp.IpData.Region + taobaoIp.IpData.City,
  151. AddressComponent = new AddressComponent()
  152. {
  153. Province = taobaoIp.IpData.Region
  154. },
  155. Pois = new List<Pois>()
  156. }
  157. };
  158. }
  159. }
  160. return null;
  161. });
  162. }
  163. }
  164. }
  165. return null;
  166. });
  167. return await await task;
  168. }
  169. }
  170. return null;
  171. }
  172. /// <summary>
  173. /// 根据IP地址获取ISP
  174. /// </summary>
  175. /// <param name="ip"></param>
  176. /// <returns></returns>
  177. public static string GetISP(this string ip)
  178. {
  179. if (ip.MatchInetAddress())
  180. {
  181. using (var client = new HttpClient { BaseAddress = new Uri("http://ip.taobao.com") })
  182. {
  183. var task = client.GetAsync($"/service/getIpInfo.php?ip={ip}").ContinueWith(async t =>
  184. {
  185. if (t.IsFaulted)
  186. {
  187. return $"未能找到{ip}的ISP信息";
  188. }
  189. var result = await t;
  190. if (result.IsSuccessStatusCode)
  191. {
  192. TaobaoIP taobaoIp = JsonConvert.DeserializeObject<TaobaoIP>(await result.Content.ReadAsStringAsync());
  193. if (taobaoIp.Code == 0)
  194. {
  195. return taobaoIp.IpData.Isp;
  196. }
  197. }
  198. return $"未能找到{ip}的ISP信息";
  199. });
  200. return task.Result.Result;
  201. }
  202. }
  203. return $"{ip}不是一个合法的IP";
  204. }
  205. #endregion
  206. /// <summary>
  207. /// 写Session
  208. /// </summary>
  209. /// <param name="session"></param>
  210. /// <param name="key">键</param>
  211. /// <param name="value">值</param>
  212. public static void Set(this ISession session, string key, object value)
  213. {
  214. session.SetString(key, value.ToJsonString());
  215. }
  216. /// <summary>
  217. /// 获取Session
  218. /// </summary>
  219. /// <typeparam name="T">对象</typeparam>
  220. /// <param name="session"></param>
  221. /// <param name="key">键</param>
  222. /// <returns>对象</returns>
  223. public static T Get<T>(this ISession session, string key)
  224. {
  225. string value = session.GetString(key);
  226. if (string.IsNullOrEmpty(value))
  227. {
  228. return default(T);
  229. }
  230. return JsonConvert.DeserializeObject<T>(value);
  231. }
  232. }
  233. }