如何从可移植类库中访问自定义HttpRequest标头

时间:2015-10-27 12:01:03

标签: c# .net http-headers request portable-class-library

我有一个客户端面向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);
        }

0 个答案:

没有答案