获取客户端 Ip Kentico 9
Get Client Ip Kentico 9
我需要获取访问该站点的客户所在的国家/地区。
我可以使用 GeoIPHelper.GetCountryByIp("ip")
获取 Counry,但是如何获取访问该站点的客户端的 ip 地址?
{%Ip%}
在宏中或 var clientIp = CMS.Helpers.RequestContext.UserHostAddress
还是要查现有客户的ip?
那将是一个 sql 查询,例如
select Convert(xml,UserLastLogonInfo)
from COM_Customer Join CMS_User on CustomerUserID = UserID
它会让你的 xml 喜欢:
<info>
<agent></agent>
<ip></ip>
</info>
查看您的代码示例,我认为您在某处的代码后面。对于 ASP.NET,这可能更常见。如果是这种情况,您可以使用 HttpContext.Current.Request.UserHostAddress
获取当前用户的 IP。
但是,如果您支持负载均衡器之类的东西,则可能会出现问题。为了解决这个问题,您可以尝试以下操作:
string userAddress = string.Empty;
if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
{
userAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
{
userAddress = HttpContext.Current.Request.UserHostAddress;
}
var country = GeoIPHelper.GetCountryByIp(userAddress);
CMS.Helpers.RequestContext
也有效(如 Shof 所说)但同样,请确保解决任何负载均衡器问题。老实说,我一直退回到只使用 Kentico 之前习惯的 HttpContext 方法。
您在使用 Kentico EMS 吗?如果是,则获取当前联系的国家/地区:
var countryId = ContactManagementContext.CurrentContact.ContactCountryId;
var country = CoutryInfoProvider.GetCountryInfo(countryId);
或
var currentLocation = GeoIPHelper.GetCurrentGeoLocation();
根据当前请求,其中还包含 country/state。
GeoLocation currentGeoLocation = GeoIPHelper.GetCurrentGeoLocation();
if (currentGeoLocation != null)
{
var countryAndState = ValidationHelper.GetString(currentGeoLocation.CountryName, "");
var ipCountryCode = ValidationHelper.GetString(currentGeoLocation.CountryCode, "");
var ipRegion = ValidationHelper.GetString(currentGeoLocation.RegionName, "");
var ipCity = ValidationHelper.GetString(currentGeoLocation.City, "");
}
或宏
{% AnalyticsContext.CurrentGeoLocation.Country.CountryName%}
{% AnalyticsContext.CurrentGeoLocation.State%}
{% AnalyticsContext.CurrentGeoLocation.City%}
{% AnalyticsContext.CurrentGeoLocation.Postalcode%}
我需要获取访问该站点的客户所在的国家/地区。
我可以使用 GeoIPHelper.GetCountryByIp("ip")
获取 Counry,但是如何获取访问该站点的客户端的 ip 地址?
{%Ip%}
在宏中或 var clientIp = CMS.Helpers.RequestContext.UserHostAddress
还是要查现有客户的ip?
那将是一个 sql 查询,例如
select Convert(xml,UserLastLogonInfo)
from COM_Customer Join CMS_User on CustomerUserID = UserID
它会让你的 xml 喜欢:
<info>
<agent></agent>
<ip></ip>
</info>
查看您的代码示例,我认为您在某处的代码后面。对于 ASP.NET,这可能更常见。如果是这种情况,您可以使用 HttpContext.Current.Request.UserHostAddress
获取当前用户的 IP。
但是,如果您支持负载均衡器之类的东西,则可能会出现问题。为了解决这个问题,您可以尝试以下操作:
string userAddress = string.Empty;
if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
{
userAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
{
userAddress = HttpContext.Current.Request.UserHostAddress;
}
var country = GeoIPHelper.GetCountryByIp(userAddress);
CMS.Helpers.RequestContext
也有效(如 Shof 所说)但同样,请确保解决任何负载均衡器问题。老实说,我一直退回到只使用 Kentico 之前习惯的 HttpContext 方法。
您在使用 Kentico EMS 吗?如果是,则获取当前联系的国家/地区:
var countryId = ContactManagementContext.CurrentContact.ContactCountryId;
var country = CoutryInfoProvider.GetCountryInfo(countryId);
或
var currentLocation = GeoIPHelper.GetCurrentGeoLocation();
根据当前请求,其中还包含 country/state。
GeoLocation currentGeoLocation = GeoIPHelper.GetCurrentGeoLocation();
if (currentGeoLocation != null)
{
var countryAndState = ValidationHelper.GetString(currentGeoLocation.CountryName, "");
var ipCountryCode = ValidationHelper.GetString(currentGeoLocation.CountryCode, "");
var ipRegion = ValidationHelper.GetString(currentGeoLocation.RegionName, "");
var ipCity = ValidationHelper.GetString(currentGeoLocation.City, "");
}
或宏
{% AnalyticsContext.CurrentGeoLocation.Country.CountryName%}
{% AnalyticsContext.CurrentGeoLocation.State%}
{% AnalyticsContext.CurrentGeoLocation.City%}
{% AnalyticsContext.CurrentGeoLocation.Postalcode%}