我有一个客户端面向UI,后端REST API,以及一个C#可移植类库,作为客户端在调用REST API时的包装。
当用户点击UI时,我希望能够在PCL中捕获该用户的IP地址,并将其作为每个HttpRequestMessage的一部分无缝地传递给REST api,而UI应用程序无需提供它。
我有完整框架的能力;但我不清楚如何将它拉下来用于PCL。
我想用来捕获用户IP地址的类的完整框架版本如下;但是一旦我将它拉到PCL,IPAddress和HttpRequest类就不可用了;基本上是我需要的核心。
.NET Code ::
public static string GetRemoteIpAddress(HttpRequest request)
{
// Added this check because when a web site starts up, there is a brief period of time while inside the
// global.application_start method where request isn't yet initialized and is an exception.
if (request == null || request is HttpException) return "0.0.0.0";
//algorithm:
//1. Check X-Forwarded-For header for non-local IP address
//2. If none exists from 1, check Toluna-NS-Forwarded-For header for non-local IP address
//3. If none exists from 2, check Remote-Addr header
//4. If none exists from 3, return UserHostAddress
if (!string.IsNullOrWhiteSpace(request.ServerVariables[HTTP_X_CLUSTER_CLIENT_IP]) &&
!string.IsNullOrWhiteSpace(parseIpAddressCsvList(request.ServerVariables[HTTP_X_CLUSTER_CLIENT_IP])))
{
return parseIpAddressCsvList(request.ServerVariables[HTTP_X_CLUSTER_CLIENT_IP]);
}
if (!string.IsNullOrWhiteSpace(request.ServerVariables[HTTP_X_FORWARDED_FOR]) &&
!string.IsNullOrWhiteSpace(parseIpAddressCsvList(request.ServerVariables[HTTP_X_FORWARDED_FOR])))
{
return parseIpAddressCsvList(request.ServerVariables[HTTP_X_FORWARDED_FOR]);
}
if (!string.IsNullOrWhiteSpace(request.ServerVariables[NS_FORWARD_FOR_KEY]) &&
isIPAddress(request.ServerVariables[NS_FORWARD_FOR_KEY]))
{
return request.ServerVariables[NS_FORWARD_FOR_KEY];
}
if (!string.IsNullOrWhiteSpace(request.ServerVariables[REMOTE_ADDR]) &&
isIPAddress(request.ServerVariables[REMOTE_ADDR]))
{
return request.ServerVariables[REMOTE_ADDR];
}
return request.UserHostAddress;
}
private static string parseIpAddressCsvList(string csvList)
{
string[] addresses = csvList.Replace(" ", string.Empty).Split(',');
return addresses.FirstOrDefault(a => !a.StartsWith("10.", StringComparison.InvariantCultureIgnoreCase) &&
!a.StartsWith("192.168.", StringComparison.InvariantCultureIgnoreCase) &&
isIPAddress(a));
}
private static bool isIPAddress(string ipAddress)
{
if (string.IsNullOrWhiteSpace(ipAddress))
return false;
IPAddress dummy;
return IPAddress.TryParse(ipAddress, out dummy);
}