public async Task <Location> ResolveIpAsync(string ip, CancellationToken cancellationToken = new CancellationToken())
        {
            if (String.IsNullOrWhiteSpace(ip) || (!ip.Contains(".") && !ip.Contains(":")))
            {
                return(null);
            }

            ip = ip.Trim();

            Location location;

            if (_cache.TryGet(ip, out location))
            {
                return(location);
            }

            if (ip.IsPrivateNetwork())
            {
                return(null);
            }

            var database = await GetDatabaseAsync(cancellationToken);

            if (database == null)
            {
                return(null);
            }

            try {
                var city = database.City(ip);
                if (city != null && city.Location != null)
                {
                    location = new Location {
                        Latitude = city.Location.Latitude, Longitude = city.Location.Longitude
                    }
                }
                ;

                _cache.Set(ip, location);
                return(location);
            } catch (Exception ex) {
                if (ex is AddressNotFoundException || ex is GeoIP2Exception)
                {
                    Log.Trace().Message(ex.Message).Write();
                    _cache.Set <Location>(ip, null);
                }
                else
                {
                    Log.Error().Exception(ex).Message("Unable to resolve geo location for ip: " + ip).Write();
                }

                return(null);
            }
        }
        public Location ResolveIp(string ip)
        {
            if (String.IsNullOrWhiteSpace(ip) || (!ip.Contains(".") && !ip.Contains(":")))
            {
                return(null);
            }

            ip = ip.Trim();

            Location location;

            if (_cache.TryGet(ip, out location))
            {
                return(location);
            }

            if (IsPrivateNetwork(ip))
            {
                return(null);
            }

            if (_reader.Value == null)
            {
                return(null);
            }

            try {
                var city = _reader.Value.City(ip);
                if (city != null && city.Location != null)
                {
                    location = new Location {
                        Latitude = city.Location.Latitude, Longitude = city.Location.Longitude
                    }
                }
                ;

                _cache.Set(ip, location);
                return(location);
            } catch (Exception ex) {
                if (ex is AddressNotFoundException || ex is GeoIP2Exception)
                {
                    Log.Info().Message(ex.Message).Write();
                    _cache.Set <Location>(ip, null);
                }
                else
                {
                    Log.Error().Exception(ex).Message("Unable to resolve geo location for ip: " + ip).Write();
                }

                return(null);
            }
        }
        public void CanSetAndGetValue()
        {
            var cache = new InMemoryCacheClient();

            cache.Set("test", 1);
            var value = cache.Get <int>("test");

            Assert.Equal(1, value);
        }
 public void CanSetAndGetValue() {
     var cache = new InMemoryCacheClient();
     cache.Set("test", 1);
     var value = cache.Get<int>("test");
     Assert.Equal(1, value);
 }