using System; using System.Collections.Generic; using System.Net.Http; using Masuit.Tools.Core.Config; using Masuit.Tools.Logging; using Masuit.Tools.Models; using Newtonsoft.Json; namespace Masuit.Tools.Core.Net { /// /// Web操作扩展 /// public static class WebExtension { #region 获取线程内唯一的EF上下文对象 /// /// 获取线程内唯一的EF上下文对象,.NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码: /// public static DataContext GetDbContext() /// { /// DataContext db; /// if (CallContext<DataContext>.GetData("db") is null) /// { /// DbContextOptions<DataContext> dbContextOption = new DbContextOptions<DataContext>(); /// DbContextOptionsBuilder<DataContext> dbContextOptionBuilder = new DbContextOptionsBuilder<DataContext>(dbContextOption); /// db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options); /// CallContext<DataContext>.SetData("db", db); /// } /// db = CallContext<DataContext>.GetData("db"); /// return db; /// } /// /// EF上下文容器对象 /// EF上下文容器对象 [Obsolete(@".NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码: public static DataContext GetDbContext() { DataContext db; if (CallContext.GetData(""db"") is null) { DbContextOptions dbContextOption = new DbContextOptions(); DbContextOptionsBuilder dbContextOptionBuilder = new DbContextOptionsBuilder(dbContextOption); db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options); CallContext.SetData(""db"", db); } db = CallContext.GetData(""db""); return db; }")] public static T GetDbContext() where T : new() { throw new Exception(@".NetCore中获取EF数据上下文对象,需要通过依赖注入的方式,请考虑在自己的项目中通过Masuit.Tools提供的CallContext对象实现获取线程内唯一的EF上下文对象,示例代码: public static DataContext GetDbContext() { DataContext db; if (CallContext.GetData(""db"") is null) { DbContextOptions dbContextOption = new DbContextOptions(); DbContextOptionsBuilder dbContextOptionBuilder = new DbContextOptionsBuilder(dbContextOption); db = new DataContext(dbContextOptionBuilder.UseSqlServer(CommonHelper.ConnectionString).Options); CallContext.SetData(""db"", db); } db = CallContext.GetData(""db""); return db; } "); } #endregion #region 获取客户端IP地址信息 /// /// 根据IP地址获取详细地理信息 /// /// /// public static Tuple> GetIPAddressInfo(this string ip) { ip.MatchInetAddress(out var isIpAddress); if (isIpAddress) { if (CoreConfig.Configuration is null) { throw new Exception("未注入IConfiguration,请先在Startup.cs的构造函数中为Masuit.Tools.Core.Config.CoreConfig.Configuration赋值"); } string ak = CoreConfig.Configuration["AppSettings:BaiduAK"]; if (string.IsNullOrEmpty(ak)) { throw new Exception("未配置BaiduAK,请先在您的应用程序appsettings.json中的AppSettings节点下添加BaiduAK配置节(注意大小写)"); } using (HttpClient client = new HttpClient() { BaseAddress = new Uri("http://api.map.baidu.com") }) { try { string ipJson = client.GetStringAsync($"/location/ip?ak={ak}&ip={ip}&coor=bd09ll").Result; var ipAddress = JsonConvert.DeserializeObject(ipJson); if (ipAddress.Status == 0) { LatiLongitude point = ipAddress.AddressInfo.LatiLongitude; 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; PhysicsAddress address = JsonConvert.DeserializeObject(result); if (address.Status == 0) { string detail = $"{address.AddressResult.FormattedAddress} {address.AddressResult.AddressComponent.Direction}{address.AddressResult.AddressComponent.Distance ?? "0"}米"; List pois = new List(); address.AddressResult.Pois.ForEach(p => { pois.Add($"{p.AddressDetail}{p.Name} {p.Direction}{p.Distance ?? "0"}米"); }); return new Tuple>(detail, pois); } } else { using (var client2 = new HttpClient { BaseAddress = new Uri("http://ip.taobao.com") }) { var result = client2.GetStringAsync($"/service/getIpInfo.php?ip={ip}").Result; TaobaoIP taobaoIp = JsonConvert.DeserializeObject(result); if (taobaoIp.Code == 0) { return new Tuple>(taobaoIp.IpData.Country + taobaoIp.IpData.Region + taobaoIp.IpData.City, new List()); } } } } catch (Exception e) { LogManager.Error(e); } } return new Tuple>("IP地址不正确", new List()); } return new Tuple>($"{ip}不是一个合法的IP地址", new List()); } /// /// 根据IP地址获取详细地理信息对象 /// /// /// public static PhysicsAddress GetPhysicsAddressInfo(this string ip) { ip.MatchInetAddress(out var isIpAddress); if (isIpAddress) { if (CoreConfig.Configuration is null) { throw new Exception("未注入IConfiguration,请先在Startup.cs的构造函数中为Masuit.Tools.Core.Config.CoreConfig.Configuration赋值"); } string ak = CoreConfig.Configuration["AppSettings:BaiduAK"]; if (string.IsNullOrEmpty(ak)) { throw new Exception("未配置BaiduAK,请先在您的应用程序appsettings.json中的AppSettings节点下添加BaiduAK配置节(注意大小写)"); } using (HttpClient client = new HttpClient() { BaseAddress = new Uri("http://api.map.baidu.com") }) { try { string ipJson = client.GetStringAsync($"/location/ip?ak={ak}&ip={ip}&coor=bd09ll").Result; var ipAddress = JsonConvert.DeserializeObject(ipJson); if (ipAddress.Status == 0) { LatiLongitude point = ipAddress.AddressInfo.LatiLongitude; 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; PhysicsAddress address = JsonConvert.DeserializeObject(result); if (address.Status == 0) { return address; } } else { using (var client2 = new HttpClient { BaseAddress = new Uri("http://ip.taobao.com") }) { var result = client2.GetStringAsync($"/service/getIpInfo.php?ip={ip}").Result; TaobaoIP taobaoIp = JsonConvert.DeserializeObject(result); if (taobaoIp.Code == 0) { return new PhysicsAddress() { Status = 0, AddressResult = new AddressResult() { FormattedAddress = taobaoIp.IpData.Country + taobaoIp.IpData.Region + taobaoIp.IpData.City, AddressComponent = new AddressComponent() { Province = taobaoIp.IpData.Region }, Pois = new List() } }; } } } } catch (Exception e) { LogManager.Error(e); } } } return null; } /// /// 根据IP地址获取ISP /// /// /// public static string GetISP(this string ip) { if (ip.MatchInetAddress()) { using (var client = new HttpClient { BaseAddress = new Uri("http://ip.taobao.com") }) { try { var result = client.GetStringAsync($"/service/getIpInfo.php?ip={ip}").Result; TaobaoIP taobaoIp = JsonConvert.DeserializeObject(result); if (taobaoIp.Code == 0) { return taobaoIp.IpData.Isp; } } catch { // ignored } } return $"未能找到{ip}的ISP信息"; } return $"{ip}不是一个合法的IP"; } #endregion } }