如何在asp.net中使用C#获取IP地址
我想在我的代码中获取访问者的公共IP地址 我已经编写了以下代码来获得它:如何在asp.net中使用C#获取IP地址,c#,asp.net,ip,C#,Asp.net,Ip,我想在我的代码中获取访问者的公共IP地址 我已经编写了以下代码来获得它: var context = System.Web.HttpContext.Current; string ip = String.Empty; if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { ip = context.Request.Serv
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;
我没有得到确切的IP地址,它会返回如下值:
fe80::9419:dfb3:22ce:4e88%68
但是当我在什么是我的IP中看到我的IP时?它显示13.67.58.30
。如何获取确切的IP地址?要获取请求的客户端IP,您可以使用以下方法读取:
var clientIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ??
Request.ServerVariables["REMOTE_ADDR"];
您看到的ip地址是IPv6地址,因此它们是有效的ip号码,由客户端发送HTTP头,因此对此您无能为力,这是错误的
您需要记住的一点是,HTTP_X_FORWARDED_FOR可以包含多个有效的IP号码
var listIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
clientIp = string.IsNullOrEmpty(listIp) ? Request.ServerVariables["REMOTE_ADDR"]
: listIp.Split(',')[0];
我建议使用
Request.ServerVariables[“HTTP\u X\u FORWARDED\u FOR”]
来抵制。原因是它被X-Forwarded-For
HTTP头传递,所有HTTP头都可以欺骗。如果使用您的代码,用户可以通过简单地替换头来模拟他们想要的任何IP。而且,不能保证所有代理都会将该头放在第一位
您可以通过以下方式获取用户的IP地址:
string ip = context.Request.UserHostAddress;
您看到的数字很可能是客户端的地址。用户主机地址。此方法获取当前请求的IP地址。它使用ASP.NET framework中的UserHostAddress属性。这是获取IP地址的字符串表示形式的最简单方法。 例子。首先,此示例代码展示了应用程序_BeginRequest方法,该方法在用户每次访问网站时执行。您可以通过“添加->全局应用程序类”来添加它。 在应用程序_BeginRequest中,我们获取当前的HttpRequest,然后访问UserHostAddress字符串属性。最后,我们将字符串值写入输出并完成请求。 获取IP地址的方法:ASP.NET,C# 申请结果 127.0.0.1 IP地址。在本例中,我在本地主机服务器上运行了该程序,该服务器在我的计算机上。在本例中,连接只是本地连接,这意味着我的本地地址是返回的IP地址。 注: 如果此代码在远程服务器上运行,则会返回internet连接的IP地址 总结。我们使用UserHostAddress属性获取了用户的当前IP地址。此方法返回一个由句点分隔的数字组成的字符串。如果您需要通过IP记录用户或特殊情况用户,则可以直接在字典中使用此选项。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>User's IP Address using ASP.NET</title>
<script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs e)
{
//Print the time when the page loaded initially
Response.Write("<span class='logo' />The Page Loaded at: " + DateTime.Now.ToLongTimeString());
divLANIPAddress.InnerHtml = GetLanIPAddress().Replace("::ffff:","");
}
/*
Method to get the IP Address of the User
*/
public String GetLanIPAddress()
{
//The X-Forwarded-For (XFF) HTTP header field is a de facto standard for identifying the originating IP address of a
//client connecting to a web server through an HTTP proxy or load balancer
String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
return ip;
}
</script>
<style type="text/css">
body
{
background-color:#32373a;
color:#FFFFFF;
}
#mainBody
{
background-color:#FFFFFF;
height:100%;
color:#32373a;
}
.divMainTime
{
width:350px;
height:30px;
background-color:#fdd136;
font-size:14px;
vertical-align:middle;
padding-top: 5px;
}
#divLANIPAddress
{
font-size:20px;
float:right;
margin-right:10px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div id='mainBody'>
<h1>
Retrieve User's IP Address
</h1>
<br />
<div class='divMainTime'>
<div style='float:left;font-size:18px;'>User's IP Address :</div>
<div id="divLANIPAddress" runat="server"></div>
</div>
</div>
</form>
</body>
</html>
使用ASP.NET的用户IP地址
公共无效页面加载(对象发送方,事件参数e)
{
//打印最初加载页面的时间
Write(“在以下位置加载的页面:”+DateTime.Now.ToLongTimeString());
divLANIPAddress.InnerHtml=GetLanIPAddress().Replace(“::ffff:”,”);
}
/*
方法获取用户的IP地址
*/
公共字符串GetLanIPAddress()
{
//X-Forwarded-For(XFF)HTTP头字段是一个事实上的标准,用于标识网络的原始IP地址
//通过HTTP代理或负载平衡器连接到web服务器的客户端
字符串ip=HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”];
if(string.IsNullOrEmpty(ip))
{
ip=HttpContext.Current.Request.ServerVariables[“REMOTE_ADDR”];
}
返回ip;
}
身体
{
背景色:#32373a;
颜色:#FFFFFF;
}
#主体
{
背景色:#FFFFFF;
身高:100%;
颜色:#32373a;
}
.divMainTime
{
宽度:350px;
高度:30px;
背景色:#fdd136;
字体大小:14px;
垂直对齐:中间对齐;
垫面:5px;
}
#divLANIPAddress
{
字体大小:20px;
浮动:对;
右边距:10px;
}
检索用户的IP地址
用户的IP地址:
您试图通过此代码获得的是您自己的IP,无论如何,这是一个老问题,请看一看
对我来说,最好的回应来自以下方面,但可以通过以下方式增强回应:
protected string GetIPAddress()
{
var context = HttpContext.Current;
var ip = context.Request.ServerVariables["REMOTE_ADDR"];
if (IsInternal(ip)) {
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
ip = ipAddress.Split(',')[0];
}
return ip;
}
/* An IP should be considered as internal when:
::1 - IPv6 loopback
10.0.0.0 - 10.255.255.255 (10/8 prefix)
127.0.0.0 - 127.255.255.255 (127/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
*/
public bool IsInternal(string testIp)
{
if(testIp == "::1") return true;
byte[] ip = IPAddress.Parse(testIp).GetAddressBytes();
switch (ip[0])
{
case 10:
case 127:
return true;
case 172:
return ip[1] >= 16 && ip[1] < 32;
case 192:
return ip[1] == 168;
default:
return false;
}
}
受保护的字符串GetIPAddress()
{
var context=HttpContext.Current;
var ip=context.Request.ServerVariables[“REMOTE_ADDR”];
如果(IsInternal(ip)){
字符串ipAddress=context.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”];
如果(!string.IsNullOrEmpty(ipAddress))
ip=ipAddress.Split(',')[0];
}
返回ip;
}
/*在以下情况下,IP应被视为内部IP:
::1-IPv6环回
10.0.0.0-10.255.255.255(10/8前缀)
127.0.0.0-127.255.255.255(127/8前缀)
172.16.0.0-172.31.255.255(172.16/12前缀)
192.168.0.0-192.168.255.255(192.168/16前缀)
*/
公共布尔IsInternal(字符串测试)
{
if(testIp==“::1”)返回true;
byte[]ip=IPAddress.Parse(testIp.GetAddressBytes();
交换机(ip[0])
{
案例10:
案例127:
返回true;
案例172:
返回ip[1]>=16&&ip[1]<32;
案例192:
返回ip[1]==168;
违约:
返回false;
}
}
在开发环境中,Ip将显示为这样,难道不可能在开发环境中获得Ip吗?如何测试该功能?如果您使用的是visual studio,则可以使用远程调试程序进行调试。您可以获得IP地址,如下所示。试试这个答案。运气不好。获取相同的值。我需要准确的IP地址,基于此,我必须执行更多操作。但当我使用
protected string GetIPAddress()
{
var context = HttpContext.Current;
var ip = context.Request.ServerVariables["REMOTE_ADDR"];
if (IsInternal(ip)) {
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
ip = ipAddress.Split(',')[0];
}
return ip;
}
/* An IP should be considered as internal when:
::1 - IPv6 loopback
10.0.0.0 - 10.255.255.255 (10/8 prefix)
127.0.0.0 - 127.255.255.255 (127/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
*/
public bool IsInternal(string testIp)
{
if(testIp == "::1") return true;
byte[] ip = IPAddress.Parse(testIp).GetAddressBytes();
switch (ip[0])
{
case 10:
case 127:
return true;
case 172:
return ip[1] >= 16 && ip[1] < 32;
case 192:
return ip[1] == 168;
default:
return false;
}
}