безопасный способ получить страну с IP-адреса в ASP.net MVC - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю на многоязычном веб-сайте, я могу получить IP-адрес пользователя, проблема в том, что я ищу очень безопасный и надежный способ получить IP-адрес и дать мне код страны, я хочу, чтобы пользователи открывали страницу своего языкапри входе на мой сайт я уже пользовался один раз, но он перестает оказывать услугу.У кого-нибудь есть идеи, как это сделать?Вот мой код, и я очень ценю любую помощь.Я ищу реальный надежный, Google или какой-либо другой API или даже любое предложение кода

    public async Task<ActionResult> Index()
    {


        try
        {
            string userIpAddress = this.Request.UserHostAddress;
            var client = new HttpClient
            {
                BaseAddress = new Uri("https:// `I need API HERE` ")
            };

            var response = await client.GetAsync(userIpAddress);

            var content = await response.Content.ReadAsStringAsync();

            var result = (Response)new XmlSerializer(typeof(Response)).Deserialize(new StringReader(content));
            var country_name = result.CountryName;
            var country_code = result.CountryCode;
            TempData["Country_code"] = country_code;
            TempData["Country_name"] = country_name;

            if (country_code == "FR")
            {
                return RedirectToAction("fr", "Home");
            }
            else if (country_code == "JP")
            {
                return RedirectToAction("jp", "Home");
            }
            else if (country_code == "DE")
            {
                return RedirectToAction("de", "Home");
            }

            else if (country_code == "NL")
            {
                return RedirectToAction("nl", "Home");
            }
            else if (country_code == "CN")
            {
                return RedirectToAction("cn", "Home");
            }
            else if (country_code == "DK")
            {
                return RedirectToAction("dk", "Home");
            }
            else if (country_code == "RU")
            {
                return RedirectToAction("ru", "Home");
            }
            else
            {
                return RedirectToAction("en", "Home");

            }


        }
        catch
        {
            return RedirectToAction("en", "Home");
        }


    }

1 Ответ

0 голосов
/ 17 сентября 2018

Не используйте IP-адреса для этого. Это не подходит для проблемы. Например, что если английский пользователь возьмет с собой в отпуск свой ноутбук и использует ваш сайт из другой страны? Предположительно, они по-прежнему хотят просматривать сайт на английском языке, но в конечном итоге вы предоставите им контент на другом языке.

Вместо этого используйте HTTP-заголовок запроса Accept-Language :

Этот заголовок является подсказкой, которую следует использовать, когда сервер не может определить язык другим способом, например, с помощью определенного URL-адреса, который контролируется явным решением пользователя.

Пример

StringWithQualityHeaderValue preferredLanguage = null;
if (Request.Headers.AllKeys.Contains("Accept-Language"))
{
    preferredLanguage = Request.Headers["Accept-Language"]
        .Split(',')
        .Select(StringWithQualityHeaderValue.Parse)
        .OrderByDescending(s => s.Quality.GetValueOrDefault(1))
        .FirstOrDefault();
}

if (preferredLanguage?.Value == "fr")
{
    return RedirectToAction("fr", "home");
}
// Check for other languages.    
// ...
// If no redirects match, default to English.
return RedirectToAction("en", "home");
...