WebExtension.cs 13 KB

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