webapi获取请求地址的IP

References required:

HttpContextWrapper - System.Web.dll
RemoteEndpointMessageProperty - System.ServiceModel.dll
OwinContext - Microsoft.Owin.dll (you will have it already if you use Owin package)

复制代码
using System.Net.Http;

public static class HttpRequestMessageExtensions
{
private const string HttpContext = “MS_HttpContext”;
private const string RemoteEndpointMessage =
“System.ServiceModel.Channels.RemoteEndpointMessageProperty”;
private const string OwinContext = “MS_OwinContext”;

public static string GetClientIpAddress(this HttpRequestMessage request)
{
   // Web-hosting. Needs reference to System.Web.dll
   if (request.Properties.ContainsKey(HttpContext))
   {
       dynamic ctx = request.Properties[HttpContext];
       if (ctx != null)
       {
           return ctx.Request.UserHostAddress;
       }
   }

   // Self-hosting. Needs reference to System.ServiceModel.dll. 
   if (request.Properties.ContainsKey(RemoteEndpointMessage))
   {
        dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
        if (remoteEndpoint != null)
        {
            return remoteEndpoint.Address;
        }
    }

   // Self-hosting using Owin. Needs reference to Microsoft.Owin.dll. 
   if (request.Properties.ContainsKey(OwinContext))
   {
       dynamic owinContext = request.Properties[OwinContext];
       if (owinContext != null)
       {
           return owinContext.Request.RemoteIpAddress;
       }
   }

    return null;
}

}
复制代码
第二种:

((System.Web.HttpContextWrapper)Request.Properties[“MS_HttpContext”]).Request.UserHostAddress;

复制代码
public class CheckIP
{
#region 获取浏览器版本号

    /// 
    /// 获取浏览器版本号
    /// 
    /// 
    public static string GetBrowser()
    {
        HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser;
        return bc.Browser + bc.Version;
    }

    #endregion

    #region 获取操作系统版本号

    /// 
    /// 获取操作系统版本号
    /// 
    /// 
    public static string GetOSVersion()
    {
        //UserAgent 
        var userAgent = HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"];

        var osVersion = "未知";

        if (userAgent.Contains("NT 6.1"))
        {
            osVersion = "Windows 7";
        }
        else if (userAgent.Contains("NT 6.0"))
        {
            osVersion = "Windows Vista/Server 2008";
        }
        else if (userAgent.Contains("NT 5.2"))
        {
            osVersion = "Windows Server 2003";
        }
        else if (userAgent.Contains("NT 5.1"))
        {
            osVersion = "Windows XP";
        }
        else if (userAgent.Contains("NT 5"))
        {
            osVersion = "Windows 2000";
        }
        else if (userAgent.Contains("NT 4"))
        {
            osVersion = "Windows NT4";
        }
        else if (userAgent.Contains("Me"))
        {
            osVersion = "Windows Me";
        }
        else if (userAgent.Contains("98"))
        {
            osVersion = "Windows 98";
        }
        else if (userAgent.Contains("95"))
        {
            osVersion = "Windows 95";
        }
        else if (userAgent.Contains("Mac"))
        {
            osVersion = "Mac";
        }
        else if (userAgent.Contains("Unix"))
        {
            osVersion = "UNIX";
        }
        else if (userAgent.Contains("Linux"))
        {
            osVersion = "Linux";
        }
        else if (userAgent.Contains("SunOS"))
        {
            osVersion = "SunOS";
        }
        return osVersion;
    }
    #endregion

    #region 获取客户端IP地址

    /// 
    /// 获取客户端IP地址
    /// 
    /// 
    public static string GetIP()
    {
        string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (string.IsNullOrEmpty(result))
        {
            result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }
        if (string.IsNullOrEmpty(result))
        {
            result = HttpContext.Current.Request.UserHostAddress;
        }
        if (string.IsNullOrEmpty(result))
        {
            return "0.0.0.0";
        }
        return result;
    }

    #endregion

    #region 取客户端真实IP

    ///    
    ///  取得客户端真实IP。如果有代理则取第一个非内网地址  
    ///    
    public static string GetIPAddress
    {
        get
        {
            var result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(result))
            {
                //可能有代理  
                if (result.IndexOf(".") == -1)        //没有“.”肯定是非IPv4格式  
                    result = null;
                else
                {
                    if (result.IndexOf(",") != -1)
                    {
                        //有“,”,估计多个代理。取第一个不是内网的IP。  
                        result = result.Replace("  ", "").Replace("'", "");
                        string[] temparyip = result.Split(",;".ToCharArray());
                        for (int i = 0; i < temparyip.Length; i++)
                        {
                            if (IsIPAddress(temparyip[i])
                                    && temparyip[i].Substring(0, 3) != "10."
                                    && temparyip[i].Substring(0, 7) != "192.168"
                                    && temparyip[i].Substring(0, 7) != "172.16.")
                            {
                                return temparyip[i];        //找到不是内网的地址  
                            }
                        }
                    }
                    else if (IsIPAddress(result))  //代理即是IP格式  
                        return result;
                    else
                        result = null;        //代理中的内容  非IP,取IP  
                }

            }

            string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != String.Empty) ? HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] : HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"];

            if (string.IsNullOrEmpty(result))
                result = HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"];

            if (string.IsNullOrEmpty(result))
                result = HttpContext.Current.Request.UserHostAddress;

            return result;
        }
    }

    #endregion

    #region  判断是否是IP格式

    ///  
    ///  判断是否是IP地址格式  0.0.0.0
    ///  
    ///  待判断的IP地址
    ///  true  or  false
    public static bool IsIPAddress(string str1)
    {
        if (string.IsNullOrEmpty(str1) || str1.Length < 7 || str1.Length > 15) return false;

        const string regFormat = @"^d{1,3}[.]d{1,3}[.]d{1,3}[.]d{1,3}$";

        var regex = new Regex(regFormat, RegexOptions.IgnoreCase);
        return regex.IsMatch(str1);
    }

    #endregion

    #region 获取公网IP
    /// 
    /// 获取公网IP
    /// 
    /// 
    public static string GetNetIP()
    {
        string tempIP = "";
        try
        {
            System.Net.WebRequest wr = System.Net.WebRequest.Create("http://city.ip138.com/ip2city.asp");
            System.IO.Stream s = wr.GetResponse().GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(s, System.Text.Encoding.GetEncoding("gb2312"));
            string all = sr.ReadToEnd(); //读取网站的数据

            int start = all.IndexOf("[") + 1;
            int end = all.IndexOf("]", start);
            tempIP = all.Substring(start, end - start);
            sr.Close();
            s.Close();
        }
        catch
        {
            if (System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.Length > 1)
                tempIP = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
            if (string.IsNullOrEmpty(tempIP))
                return GetIP();
        }
        return tempIP;
    }
    #endregion

复制代码

复制代码
///
/// 获取客户端IP地址(无视代理)
///
/// 若失败则返回回送地址
public static string GetHostAddress()
{
string userHostAddress = HttpContext.Current.Request.ServerVariables[“REMOTE_ADDR”];
if (string.IsNullOrEmpty(userHostAddress))
{
if (System.Web.HttpContext.Current.Request.ServerVariables[“HTTP_VIA”] != null)
userHostAddress = HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”].ToString().Split(’,’)[0].Trim();
}
if (string.IsNullOrEmpty(userHostAddress))
{
userHostAddress = HttpContext.Current.Request.UserHostAddress;
}

        //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
        if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
        {
            return userHostAddress;
        }
        return "127.0.0.1";
    }

    /// 
    /// 检查IP地址格式
    /// 
    /// 
    /// 
    public static bool IsIP(string ip)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
    }

复制代码

你可能感兴趣的:(webapi获取请求地址的IP)