国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

如何確認訪客所在的國家

2019-11-17 01:39:47
字體:
供稿:網(wǎng)友

如何確認訪客所在的國家

在建設(shè)網(wǎng)站的時候,有時會遇到根據(jù)不同國家的訪客顯示不同信息的需求。尤其是網(wǎng)站所用語言的國際化要求,比如對美國的訪客顯示英語,對中國的訪客顯示中文。

有兩種途徑能夠解決此問題。

一. 使用CultureInfo與RegionInfo類

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;}
  • 通過Request取得訪客客戶端所用語言
  • 由該語言代碼生成CultureInfo
  • 由所生成的CultureInfo的LCID生成RegionInfo
  • 取得RegionInfo的TwoLetterISORegionName值,即ISO 3166中使用兩位字母所代表的國家/地區(qū)

* 使用中文環(huán)境的客戶端(zh-CN)會得到"CN"的結(jié)果,而使用英文環(huán)境的客戶端(en-US)則會得到"US"。

* 這種方法很明顯會有個問題,判斷的結(jié)果依賴訪客的客戶端語言環(huán)境而非真實的所在國家地理位置。

二. 使用MaxMind的免費數(shù)據(jù)庫及相關(guān)API

通過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;    }}
  • 實例化DatabaseReader,將數(shù)據(jù)庫所在路徑作為其構(gòu)造方法的參數(shù)
  • 取得客戶端IP地址
  • 由IP地址查詢所在國家
  • 得到國家的IsoCode,同樣是ISO 3166中使用兩位字母所代表的國家/地區(qū)

* 如果無法從數(shù)據(jù)庫中取得對應信息,上述方法會拋出異常,所以在實際開發(fā)時有必要加上try/catch語句加以控制。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 旅游| 吴江市| 方山县| 沂水县| 保康县| 隆回县| 名山县| 富锦市| 安西县| 锡林浩特市| 绿春县| 北川| 宣恩县| 旺苍县| 天门市| 峡江县| 蓬莱市| 玉龙| 育儿| 喀喇沁旗| 四子王旗| 清新县| 长治县| 临朐县| 兰西县| 靖宇县| 榆树市| 确山县| 宁武县| 沙坪坝区| 溧阳市| 临泉县| 喀喇沁旗| 怀柔区| 页游| 错那县| 揭阳市| 宜川县| 大渡口区| 阜平县| 静宁县|