Как вы получаете название страны пользователя в C #? - PullRequest
1 голос
/ 17 января 2012

В настоящее время я использую геолокацию для получения названия страны пользователя. Вот мой код:

navigator.geolocation.getCurrentPosition(function (pos) {
    var latlng = pos.coords.latitude + "," + pos.coords.longitude;
    var apiurl = 'http://maps.google.com/maps/geo?output=json&sensor=false&q=' + latlng;
    var yqlqry = encodeURIComponent('select * from json where url="' + apiurl + '"');
    var yqlurl = 'http://query.yahooapis.com/v1/public/yql?q=' + yqlqry + '&format=json&callback=?';
    $.getJSON(yqlurl, function (data) {
        var countryName = data.query.results.json.Placemark.AddressDetails.Country.CountryName;
        var newCountryName = countryName.toLowerCase();
        if (newCountryName == "united states")
            newCountryName = "us";
        else if (newCountryName == "england" || newCountryName == "ireland" || newCountryName == "scotland" || newCountryName == "wales" || newCountryName == "northern ireland")
            newCountryName = "uk";
        else if (newCountryName == "australia")
            newCountryName = "au";
        else if (newCountryName == "canada")
            newCountryName = "ca";
        else
            newCountryName = "world";
        $('a[title = "' + newCountryName + '"]').trigger('click');
    });
});

Я бы предпочел использовать что-то на стороне сервера. Кто-нибудь знает, можно ли получить название страны пользователя в C #?

Ответы [ 4 ]

3 голосов
/ 17 января 2012

На стороне сервера единственное, на что вы можете ответить, - это IP-адрес, который вы можете использовать для поиска местоположения.Существуют бесплатные базы данных сопоставлений IP-адресов и местоположений, или вы можете использовать HostIP.info.

Для получения дополнительной информации см. https://stackoverflow.com/questions/372591/how-to-get-city-country-and-country-code-for-a-particular-ip-address-in-asp-ne.

0 голосов
/ 17 января 2012

Почему бы вам не попробовать API IP2Location?

Вы можете просто передать свой ipaddress вот так.

http://api.ip2location.com/?ip=145.228.219.221&key=demo

Больше информации на

http://www.ip2location.com/ip-country-web-service.aspx

0 голосов
/ 17 января 2012

Я сделал это для WP7, но код в стандартном фреймворке.net почти такой же: http://www.felicepollano.com/2012/01/11/AnImplementationOfICivicAddressResolverForWP7.aspx класс, выполняющий работу, ниже. Просто удалите ICivicAddressResolver, который является зависимостью WP7, и создайте свой собственный интерфейс.

 public class AddressResolver:ICivicAddressResolver
    {
        string language = "en-GB";
        public AddressResolver()
        {

        }
        public AddressResolver(string language)
        {
            this.language = language;
        }
        [DataContract]
        public class AddressInfo
        {
            [DataMember(Name = "formatted_address")]
            public string FormattedAddress { get; set; }
        }
        [DataContract]
        public class ResultInfo
        {
            [DataMember(Name = "results")]
            public AddressInfo[] Info { get; set; }
        }
        readonly string URITemplate = "http://maps.googleapis.com/maps/api/geocode/json?latlng={0},{1}&sensor=true&language={2}";
        #region ICivicAddressResolver Members

        public CivicAddress ResolveAddress(GeoCoordinate coordinate)
        {
            throw new NotImplementedException("Use async version instead");
        }

        public void ResolveAddressAsync(GeoCoordinate coordinate)
        {
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            client.DownloadStringCompleted += (s, e) =>
            {
                if (e.Error == null)
                {
                    var ainfo = ReadToObject<ResultInfo>(e.Result);
                    ResolveAddressCompleted(this, new ResolveAddressCompletedEventArgs(ToCivic(ainfo),e.Error,false,null));
                }
                else
                {
                    ResolveAddressCompleted(this, new ResolveAddressCompletedEventArgs(new CivicAddress(), e.Error, false, null));
                }
            };
            client.DownloadStringAsync(new Uri(GetFormattedUri(coordinate)));
        }

        private CivicAddress ToCivic(ResultInfo ainfo)
        {
            List<string> res = new List<string>();
            foreach (var single in ainfo.Info)
            {
                res.Add(single.FormattedAddress);
            }
            if (res.Count > 0)
                return new CivicAddress() { AddressLine1 = res[0] };
            else
                return new CivicAddress() { AddressLine1 = "#UNKNOWN#" };
        }

        public event EventHandler<ResolveAddressCompletedEventArgs> ResolveAddressCompleted = delegate { };

        #endregion
        private string GetFormattedUri(GeoCoordinate coord)
        {
            return string.Format(CultureInfo.InvariantCulture, URITemplate, coord.Latitude, coord.Longitude,language);
        }
        public static T ReadToObject<T>(string json) where T : class
        {
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            T res = ser.ReadObject(ms) as T;
            ms.Close();
            return res;
        }
    }
0 голосов
/ 17 января 2012

Не знаю, поможет ли это, но локально это

CultureInfo.CurrentCulture.Name

возвращает что-то вроде "en-GB" или "fr-FR" в зависимости от вашей текущей локали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...