可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want the public IP address of the client who is using my website.
The code below is showing the local IP in the LAN, but I want the public IP of the client.
//get mac address
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
String sMacAddress = string.Empty;
foreach (NetworkInterface adapter in nics)
{
if (sMacAddress == String.Empty)// only return MAC Address from first card
{
IPInterfaceProperties properties = adapter.GetIPProperties();
sMacAddress = adapter.GetPhysicalAddress().ToString();
}
}
// To Get IP Address
string IPHost = Dns.GetHostName();
string IP = Dns.GetHostByName(IPHost).AddressList[0].ToString();
Output:
Ip Address : 192.168.1.7
Please help me to get the public IP address.
回答1:
This is what I use:
protected void GetUser_IP()
{
string VisitorsIPAddr = string.Empty;
if (HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"] != null)
{
VisitorsIPAddr = HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"].ToString();
}
else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
{
VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;
}
uip.Text = \"Your IP is: \" + VisitorsIPAddr;
}
\"uip\" is the name of the label in the aspx page that shows the user IP.
回答2:
You can use \"HTTP_X_FORWARDED_FOR\" or \"REMOTE_ADDR\" header attribute.
Refer method GetVisitorIPAddress from Machine Syntax blog .
/// <summary>
/// method to get Client ip address
/// </summary>
/// <param name=\"GetLan\"> set to true if want to get local(LAN) Connected ip address</param>
/// <returns></returns>
public static string GetVisitorIPAddress(bool GetLan = false)
{
string visitorIPAddress = HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"];
if (String.IsNullOrEmpty(visitorIPAddress))
visitorIPAddress = HttpContext.Current.Request.ServerVariables[\"REMOTE_ADDR\"];
if (string.IsNullOrEmpty(visitorIPAddress))
visitorIPAddress = HttpContext.Current.Request.UserHostAddress;
if (string.IsNullOrEmpty(visitorIPAddress) || visitorIPAddress.Trim() == \"::1\")
{
GetLan = true;
visitorIPAddress = string.Empty;
}
if (GetLan && string.IsNullOrEmpty(visitorIPAddress))
{
//This is for Local(LAN) Connected ID Address
string stringHostName = Dns.GetHostName();
//Get Ip Host Entry
IPHostEntry ipHostEntries = Dns.GetHostEntry(stringHostName);
//Get Ip Address From The Ip Host Entry Address List
IPAddress[] arrIpAddress = ipHostEntries.AddressList;
try
{
visitorIPAddress = arrIpAddress[arrIpAddress.Length - 2].ToString();
}
catch
{
try
{
visitorIPAddress = arrIpAddress[0].ToString();
}
catch
{
try
{
arrIpAddress = Dns.GetHostAddresses(stringHostName);
visitorIPAddress = arrIpAddress[0].ToString();
}
catch
{
visitorIPAddress = \"127.0.0.1\";
}
}
}
}
return visitorIPAddress;
}
回答3:
Combination of all of these suggestions, and the reasons behind them. Feel free to add more test cases too. If getting the client IP is of utmost importance, than you might wan to get all of theses are run some comparisons on which result might be more accurate.
Simple check of all suggestions in this thread plus some of my own code...
using System.IO;
using System.Net;
public string GetUserIP()
{
string strIP = String.Empty;
HttpRequest httpReq = HttpContext.Current.Request;
//test for non-standard proxy server designations of client\'s IP
if (httpReq.ServerVariables[\"HTTP_CLIENT_IP\"] != null)
{
strIP = httpReq.ServerVariables[\"HTTP_CLIENT_IP\"].ToString();
}
else if (httpReq.ServerVariables[\"HTTP_X_FORWARDED_FOR\"] != null)
{
strIP = httpReq.ServerVariables[\"HTTP_X_FORWARDED_FOR\"].ToString();
}
//test for host address reported by the server
else if
(
//if exists
(httpReq.UserHostAddress.Length != 0)
&&
//and if not localhost IPV6 or localhost name
((httpReq.UserHostAddress != \"::1\") || (httpReq.UserHostAddress != \"localhost\"))
)
{
strIP = httpReq.UserHostAddress;
}
//finally, if all else fails, get the IP from a web scrape of another server
else
{
WebRequest request = WebRequest.Create(\"http://checkip.dyndns.org/\");
using (WebResponse response = request.GetResponse())
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
strIP = sr.ReadToEnd();
}
//scrape ip from the html
int i1 = strIP.IndexOf(\"Address: \") + 9;
int i2 = strIP.LastIndexOf(\"</body>\");
strIP = strIP.Substring(i1, i2 - i1);
}
return strIP;
}
回答4:
That code gets you the IP address of your server not the address of the client who is accessing your website. Use the HttpContext.Current.Request.UserHostAddress property to the client\'s IP address.
回答5:
For Web Applications ( ASP.NET MVC and WebForm )
/// <summary>
/// Get current user ip address.
/// </summary>
/// <returns>The IP Address</returns>
public static string GetUserIPAddress()
{
var context = System.Web.HttpContext.Current;
string ip = String.Empty;
if (context.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"] != null)
ip = context.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"].ToString();
else if (!String.IsNullOrWhiteSpace(context.Request.UserHostAddress))
ip = context.Request.UserHostAddress;
if (ip == \"::1\")
ip = \"127.0.0.1\";
return ip;
}
For Windows Applications ( Windows Form, Console, Windows Service , ... )
static void Main(string[] args)
{
HTTPGet req = new HTTPGet();
req.Request(\"http://checkip.dyndns.org\");
string[] a = req.ResponseBody.Split(\':\');
string a2 = a[1].Substring(1);
string[] a3=a2.Split(\'<\');
string a4 = a3[0];
Console.WriteLine(a4);
Console.ReadLine();
}
回答6:
So many of these code snippets are really big and could confuse new programmers looking for help.
How about this simple and compact code to fetch the IP address of the visitor?
string ip = System.Web.HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"];
if (string.IsNullOrEmpty(ip))
{
ip = System.Web.HttpContext.Current.Request.ServerVariables[\"REMOTE_ADDR\"];
}
Simple, short and compact.
回答7:
I have an extension method:
public static string GetIp(this HttpContextBase context)
{
if (context == null || context.Request == null)
return string.Empty;
return context.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"]
?? context.Request.UserHostAddress;
}
Note: \"HTTP_X_FORWARDED_FOR\" is for ip behind proxy. context.Request.UserHostAddress is identical to \"REMOTE_ADDR\".
But bear in mind it is not necessary the actual IP though.
Sources:
IIS Server Variables
Link
回答8:
My version handles both ASP.NET or LAN IPs:
/**
* Get visitor\'s ip address.
*/
public static string GetVisitorIp() {
string ip = null;
if (HttpContext.Current != null) { // ASP.NET
ip = string.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"])
? HttpContext.Current.Request.UserHostAddress
: HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"];
}
if (string.IsNullOrEmpty(ip) || ip.Trim() == \"::1\") { // still can\'t decide or is LAN
var lan = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(r => r.AddressFamily == AddressFamily.InterNetwork);
ip = lan == null ? string.Empty : lan.ToString();
}
return ip;
}
回答9:
private string GetClientIpaddress()
{
string ipAddress = string.Empty;
ipAddress = HttpContext.Current.Request.ServerVariables[\"HTTP_X_FORWARDED_FOR\"];
if (ipAddress == \"\" || ipAddress == null)
{
ipAddress = HttpContext.Current.Request.ServerVariables[\"REMOTE_ADDR\"];
return ipAddress;
}
else
{
return ipAddress;
}
}
回答10:
On MVC 5 you can use this:
string cIpAddress = Request.UserHostAddress; //Gets the client ip address
or
string cIpAddress = Request.ServerVariables[\"REMOTE_ADDR\"]; //Gets the client ip address
回答11:
In MVC IP can be obtained by the following Code
string ipAddress = Request.ServerVariables[\"REMOTE_ADDR\"];
回答12:
string IP = HttpContext.Current.Request.Params[\"HTTP_CLIENT_IP\"] ?? HttpContext.Current.Request.UserHostAddress;
回答13:
just use this..................
public string GetIP()
{
string externalIP = \"\";
externalIP = (new WebClient()).DownloadString(\"http://checkip.dyndns.org/\");
externalIP = (new Regex(@\"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\")).Matches(externalIP)[0].ToString();
return externalIP;
}
回答14:
We connect to servers that give us our external IP address and try to parse the IP from returning HTML pages. But when servers make small changes on these pages or remove them, these methods stop working properly.
Here is a method that takes the external IP address using a server which has been alive for years and returns a simple response rapidly...
https://www.codeproject.com/Tips/452024/Getting-the-External-IP-Address
Private string getExternalIp()
{
try
{
string externalIP;
externalIP = (new
WebClient()).DownloadString(\"http://checkip.dyndns.org/\");
externalIP = (new Regex(@\"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\"))
.Matches(externalIP)[0].ToString();
return externalIP;
}
catch { return null; }
}
VB.NET
Imports System.Net
Private Function GetExternalIp() As String
Try
Dim ExternalIP As String
ExternalIP = (New WebClient()).DownloadString(\"http://checkip.dyndns.org/\")
ExternalIP = (New Regex(\"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\")) _
.Matches(ExternalIP)(0).ToString()
Return ExternalIP
Catch
Return Nothing
End Try
End Function
回答15:
lblmessage.Text =Request.ServerVariables[\"REMOTE_HOST\"].ToString();