public async Task <BlogResponse <List <string> > > Ip2RegionAsync(string ip) { var response = new BlogResponse <List <string> >(); if (ip.IsNullOrEmpty()) { ip = _httpContextAccessor.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault() ?? _httpContextAccessor.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault() ?? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } else { if (!ip.IsIp()) { response.IsFailed("The ip address error."); return(response); } } var path = Path.Combine(Directory.GetCurrentDirectory(), "Resources/ip2region.db"); using var _search = new DbSearcher(path); var block = await _search.BinarySearchAsync(ip); var region = block.Region.Split("|").Distinct().Where(x => x != "0").ToList(); region.AddFirst(ip); response.Result = region; return(response); }
public async Task SearchAsync_Test() { // We don't need the synchronizeContext, so just set to false var memResult = await _search.MemorySearchAsync("183.192.62.65").ConfigureAwait(false); var binarySearchResult = await _search.BinarySearchAsync("183.192.62.65").ConfigureAwait(false); var bTreeSearchResult = await _search.BtreeSearchAsync("183.192.62.65").ConfigureAwait(false); Assert.NotNull(memResult.Region); Assert.NotNull(binarySearchResult.Region); Assert.NotNull(bTreeSearchResult.Region); Assert.Equal(memResult.Region, binarySearchResult.Region); Assert.Equal(bTreeSearchResult.Region, memResult.Region); }
public async Task <Response <string> > Ip2Region([RegularExpression(@"\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}", ErrorMessage = "ip格式有误")] string ip) { var response = new Response <string>(); if (string.IsNullOrEmpty(ip)) { ip = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } } var path = Path.Combine(Directory.GetCurrentDirectory(), "Resources/ip2region.db"); using var _search = new DbSearcher(path); var result = (await _search.BinarySearchAsync(ip)).Region; response.Result = result; return(response); }