在建設(shè)網(wǎng)站的時候,有時會遇到根據(jù)不同國家的訪客顯示不同信息的需求。尤其是網(wǎng)站所用語言的國際化要求,比如對美國的訪客顯示英語,對中國的訪客顯示中文。
有兩種途徑能夠解決此問題。
public static string GetISORegionName(HttPRequest request){ var lan = request.UserLanguages.First(); var cultureInfo = CultureInfo.CreateSpecificCulture(lan); var regionInfo = new RegionInfo(cultureInfo.LCID); return regionInfo.TwoLetterISORegionName;}
* 使用中文環(huán)境的客戶端(zh-CN)會得到"CN"的結(jié)果,而使用英文環(huán)境的客戶端(en-US)則會得到"US"。
* 這種方法很明顯會有個問題,判斷的結(jié)果依賴訪客的客戶端語言環(huán)境而非真實的所在國家地理位置。
通過ip地址取得對應的國家地理位置,可以采用數(shù)據(jù)供應商所提供的數(shù)據(jù)庫,以一般查詢的方式獲得相應的信息。不過這些數(shù)據(jù)庫通常是需要付費的。
當然也有免費的產(chǎn)品,比如MaxMind發(fā)布的免費數(shù)據(jù)庫。
數(shù)據(jù)庫的下載地址:http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
需要用到的dll可以由NuGet方法取得,PM> Install-Package MaxMind.GeoIP2 ,安裝完成后項目中會新加MaxMind.Db以及MaxMind.GeoIP2兩個dll引用。
在調(diào)用GeoIP2的API之前,還需要完成一項工作,即取得訪客的IP地址。
最簡單的方式是使用HttpContext.Current.Request.UserHostAddress ,不過在訪客使用代理服務器的場景下,此方式所獲得的IP地址就是不正確的了。
因此需要變更方法,改用下列的代碼:
public static string GetClientIpAddress(HttpRequest request){ var userHostAddress = request.UserHostAddress; var xForwardedFor = request.ServerVariables["X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(xForwardedFor)) return userHostAddress; var forwardingIps = xForwardedFor.Split(',').ToList(); return forwardingIps.Any() ? forwardingIps.Last() : userHostAddress;}當這一步完成后,就可以進入正題,調(diào)用GeoIP2的API以獲得訪客所處的國家。
public static string GetISOCodeByMaxMind(HttpRequest request){ using (var reader = new DatabaseReader(HttpContext.Current.Server.MapPath("~/GeoLite2-Country.mmdb"))) { var ipAddress = GetClientIpAddress(request); var country = reader.Country(ipAddress); return country.Country.IsoCode; }}* 如果無法從數(shù)據(jù)庫中取得對應信息,上述方法會拋出異常,所以在實際開發(fā)時有必要加上try/catch語句加以控制。
新聞熱點
疑難解答