ASP.NET中如何获取客户端电脑名,数据库,ip等信息?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET中如何获取客户端电脑名,数据库,ip等信息?相关的知识,希望对你有一定的参考价值。
如题所示的
参考技术A 1. 在ASP.NET中专用属性:获取服务器电脑名:Page.Server.ManchineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress
2. 在网络编程中的通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名)。AddressList
也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址)。HostName
3. 系统环境类的通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName 参考技术B 自己筛选吧,这是我一个页面所获得电脑的一些信息的方法,我就不给你一个一个找了 你慢慢试 肯定能实现你的需求
lbServerName.Text = "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
lbIp.Text = Request.ServerVariables["LOCAl_ADDR"];
lbDomain.Text = Request.ServerVariables["SERVER_NAME"].ToString();
lbPort.Text = Request.ServerVariables["Server_Port"].ToString();
lbIISVer.Text = Request.ServerVariables["Server_SoftWare"].ToString();
lbphpath.Text = Request.PhysicalApplicationPath;
lbOperat.Text = Environment.OSVersion.ToString();
lbSystemPath.Text = Environment.SystemDirectory.ToString();
lbTimeOut.Text = (Server.ScriptTimeout / 1000).ToString() + "秒";
lbLan.Text = CultureInfo.InstalledUICulture.EnglishName;
lbAspnetVer.Text = string.Concat(new object[] Environment.Version.Major, ".", Environment.Version.Minor, Environment.Version.Build, ".", Environment.Version.Revision );
lbCurrentTime.Text = DateTime.Now.ToString();
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Version Vector");
lbIEVer.Text = key.GetValue("IE", "未检测到").ToString();
lbServerLastStartToNow.Text = ((Environment.TickCount / 0x3e8) / 60).ToString() + "分钟";
string[] achDrives = Directory.GetLogicalDrives();
for (int i = 0; i < Directory.GetLogicalDrives().Length - 1; i++)
lbLogicDriver.Text = lbLogicDriver.Text + achDrives[i].ToString();
//ManagementClass diskClass = new ManagementClass("NUMBER_OF_PROCESSORS");
lbCpuNum.Text = Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS").ToString();
lbCpuType.Text = Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").ToString();
lbMemory.Text = (Environment.WorkingSet / 1024).ToString() + "M";
lbMemoryPro.Text = ((Double)GC.GetTotalMemory(false) / 1048576).ToString("N2") + "M";
lbMemoryNet.Text = ((Double)Process.GetCurrentProcess().WorkingSet64 / 1048576).ToString("N2") + "M";
lbCpuNet.Text = ((TimeSpan)Process.GetCurrentProcess().TotalProcessorTime).TotalSeconds.ToString("N0");
lbSessionNum.Text = Session.Contents.Count.ToString();
lbSession.Text = Session.Contents.SessionID;
lbUser.Text = Environment.UserName;
如何在 ASP.NET MVC 中获取客户端的 IP 地址?
【中文标题】如何在 ASP.NET MVC 中获取客户端的 IP 地址?【英文标题】:How can I get the client's IP address in ASP.NET MVC? 【发布时间】:2011-02-04 08:53:57 【问题描述】:我是 ASP.NET MVC 堆栈的新手,我想知道简单的 Page 对象和 Request ServerVariables 对象发生了什么?
基本上,我想提取客户端 PC 的 IP 地址,但我不明白当前的 MVC 结构是如何改变这一切的。
据我所知,most of the variable objects has been replaced by the HttpRequest variants。
有人愿意分享一些资源吗?在 ASP.NET MVC 世界中确实有很多东西要学习。 :)
例如,我有一个带有这个当前函数的静态类。如何使用 ASP.NET MVC 获得相同的结果?
public static int getCountry(Page page)
return getCountryFromIP(getIPAddress(page));
public static string getIPAddress(Page page)
string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
string szIP = "";
if (szXForwardedFor == null)
szIP = szRemoteAddr;
else
szIP = szXForwardedFor;
if (szIP.IndexOf(",") > 0)
string [] arIPs = szIP.Split(',');
foreach (string item in arIPs)
if (!isPrivateIP(item))
return item;
return szIP;
我如何从控制器页面调用这个函数?
【问题讨论】:
nuget.org/packages/XFF ***.com/questions/21155352/… 【参考方案1】:简单的答案是使用HttpRequest.UserHostAddress property。
示例:从控制器内部:
using System;
using System.Web.Mvc;
namespace Mvc.Controllers
public class HomeController : ClientController
public ActionResult Index()
string ip = Request.UserHostAddress;
...
示例:从帮助程序类中:
using System.Web;
namespace Mvc.Helpers
public static class HelperClass
public static string GetIPHelper()
string ip = HttpContext.Current.Request.UserHostAddress;
..
但是,如果请求已被一个或多个 proxy servers 传递,那么 HttpRequest.UserHostAddress property 返回的 IP 地址将是最后一个中继该请求的代理服务器的 IP 地址请求。
代理服务器可以使用 de facto 标准将客户端的 IP 地址放在X-Forwarded-For HTTP 标头中。除了不能保证请求具有 X-Forwarded-For 标头之外,也不能保证 X-Forwarded-For 不是 SPOOFED。
原答案
Request.UserHostAddress
上面的代码提供了客户端的 IP 地址,而无需查找集合。 Request 属性在控制器(或视图)中可用。因此,您可以传递一个 Request 对象来获得相同的结果,而不是将 Page 类传递给您的函数:
public static string getIPAddress(HttpRequestBase request)
string szRemoteAddr = request.UserHostAddress;
string szXForwardedFor = request.ServerVariables["X_FORWARDED_FOR"];
string szIP = "";
if (szXForwardedFor == null)
szIP = szRemoteAddr;
else
szIP = szXForwardedFor;
if (szIP.IndexOf(",") > 0)
string [] arIPs = szIP.Split(',');
foreach (string item in arIPs)
if (!isPrivateIP(item))
return item;
return szIP;
【讨论】:
@makerofthings7:可以有多个值,因为多个代理服务器可能会沿着客户端的 HTTP 请求转发。如果代理服务器“表现良好”(与故意匿名代理或编程不当的代理相反),每个代理服务器都会在 XFF 标头中添加前一个代理的 IP。 isPrivateIP 方法有什么作用? "::1" 表示本地主机。只是一个简单的说明。 X-Forwarded-For 标头由分析数据包并充当中间人的防火墙和负载平衡器添加。为了保留原始用户的 IP 地址,添加了此标头,以便可以检索原始信息。当数据包被重写时,新的 ip 地址通常是内部 ip,不是很有用。 我看到“::1”,根据@tomg,它是本地主机。我的问题是:当我在互联网上发布我的网站时,我可以获取 IP 地址吗?谢谢【参考方案2】:Request.ServerVariables["REMOTE_ADDR"]
应该可以工作 - 直接在视图中或在控制器操作方法体中(Request 是 MVC 中 Controller 类的属性,而不是 Page)。
它正在工作..但你必须在真实的 IIS 上发布,而不是虚拟的。
【讨论】:
如何从控制器端调用它? 大声笑,嘿,这行得通,如果我想把它放到上面的类对象中会发生什么?我还需要页面对象吗? 我认为你可以使用 HttpContext.Current.Request Adrian 的回答(如下)要好得多 - 它不需要通过魔术字符串进行查找。使用 Request.UserHostAddress 这总是返回运行我的应用程序的服务器的 IP 地址。有什么原因吗?【参考方案3】:这里的很多代码都非常有用,但我出于自己的目的对其进行了清理并添加了一些测试。这是我最终得到的结果:
using System;
using System.Linq;
using System.Net;
using System.Web;
public class RequestHelpers
public static string GetClientIpAddress(HttpRequestBase request)
try
var userHostAddress = request.UserHostAddress;
// Attempt to parse. If it fails, we catch below and return "0.0.0.0"
// Could use TryParse instead, but I wanted to catch all exceptions
IPAddress.Parse(userHostAddress);
var xForwardedFor = request.ServerVariables["X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(xForwardedFor))
return userHostAddress;
// Get a list of public ip addresses in the X_FORWARDED_FOR variable
var publicForwardingIps = xForwardedFor.Split(',').Where(ip => !IsPrivateIpAddress(ip)).ToList();
// If we found any, return the last one, otherwise return the user host address
return publicForwardingIps.Any() ? publicForwardingIps.Last() : userHostAddress;
catch (Exception)
// Always return all zeroes for any failure (my calling code expects it)
return "0.0.0.0";
private static bool IsPrivateIpAddress(string ipAddress)
// http://en.wikipedia.org/wiki/Private_network
// Private IP Addresses are:
// 24-bit block: 10.0.0.0 through 10.255.255.255
// 20-bit block: 172.16.0.0 through 172.31.255.255
// 16-bit block: 192.168.0.0 through 192.168.255.255
// Link-local addresses: 169.254.0.0 through 169.254.255.255 (http://en.wikipedia.org/wiki/Link-local_address)
var ip = IPAddress.Parse(ipAddress);
var octets = ip.GetAddressBytes();
var is24BitBlock = octets[0] == 10;
if (is24BitBlock) return true; // Return to prevent further processing
var is20BitBlock = octets[0] == 172 && octets[1] >= 16 && octets[1] <= 31;
if (is20BitBlock) return true; // Return to prevent further processing
var is16BitBlock = octets[0] == 192 && octets[1] == 168;
if (is16BitBlock) return true; // Return to prevent further processing
var isLinkLocalAddress = octets[0] == 169 && octets[1] == 254;
return isLinkLocalAddress;
这里有一些针对该代码的 NUnit 测试(我正在使用 Rhino Mocks 来模拟 HttpRequestBase,即下面的 M
using System.Web;
using NUnit.Framework;
using Rhino.Mocks;
using Should;
[TestFixture]
public class HelpersTests : TestBase
HttpRequestBase _httpRequest;
private const string XForwardedFor = "X_FORWARDED_FOR";
private const string MalformedIpAddress = "MALFORMED";
private const string DefaultIpAddress = "0.0.0.0";
private const string GoogleIpAddress = "74.125.224.224";
private const string MicrosoftIpAddress = "65.55.58.201";
private const string Private24Bit = "10.0.0.0";
private const string Private20Bit = "172.16.0.0";
private const string Private16Bit = "192.168.0.0";
private const string PrivateLinkLocal = "169.254.0.0";
[SetUp]
public void Setup()
_httpRequest = M<HttpRequestBase>();
[TearDown]
public void Teardown()
_httpRequest = null;
[Test]
public void PublicIpAndNullXForwardedFor_Returns_CorrectIp()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(null);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(GoogleIpAddress);
[Test]
public void PublicIpAndEmptyXForwardedFor_Returns_CorrectIp()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(string.Empty);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(GoogleIpAddress);
[Test]
public void MalformedUserHostAddress_Returns_DefaultIpAddress()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(MalformedIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(null);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(DefaultIpAddress);
[Test]
public void MalformedXForwardedFor_Returns_DefaultIpAddress()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(MalformedIpAddress);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(DefaultIpAddress);
[Test]
public void SingleValidPublicXForwardedFor_Returns_XForwardedFor()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(MicrosoftIpAddress);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(MicrosoftIpAddress);
[Test]
public void MultipleValidPublicXForwardedFor_Returns_LastXForwardedFor()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(GoogleIpAddress + "," + MicrosoftIpAddress);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(MicrosoftIpAddress);
[Test]
public void SinglePrivateXForwardedFor_Returns_UserHostAddress()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(Private24Bit);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(GoogleIpAddress);
[Test]
public void MultiplePrivateXForwardedFor_Returns_UserHostAddress()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
const string privateIpList = Private24Bit + "," + Private20Bit + "," + Private16Bit + "," + PrivateLinkLocal;
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(privateIpList);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(GoogleIpAddress);
[Test]
public void MultiplePublicXForwardedForWithPrivateLast_Returns_LastPublic()
// Arrange
_httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress);
const string privateIpList = Private24Bit + "," + Private20Bit + "," + MicrosoftIpAddress + "," + PrivateLinkLocal;
_httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(privateIpList);
// Act
var ip = RequestHelpers.GetClientIpAddress(_httpRequest);
// Assert
ip.ShouldEqual(MicrosoftIpAddress);
【讨论】:
这总是返回运行我的应用程序的服务器的 IP 地址。 不应该返回publicForwardingIps.First()
吗?
@Noah 我猜这不适用于 IPv6 地址?
不错的解决方案! IPAddress.Parse() 是否也应该用于其他 IP 地址?【参考方案4】:
我在使用上述方法时遇到了问题,我需要来自控制器的 IP 地址。我最后使用了以下内容:
System.Web.HttpContext.Current.Request.UserHostAddress
【讨论】:
从控制器中你所要做的就是HttpContext.Request.UserHostAddress
谢谢。这就是我在辅助类中需要的,而不是在控制器或视图上下文中。这是一个很好的通用答案。 +1
@gander 你是什么意思?我应该写声明吗?
在helper类的顶部,只要写“using System.Web;”,那么你只需要写“HttpContext.Current.Request.UserHostAddress”。仅针对像我这样的懒惰程序员(并解释了为什么 Tom 的回答和 Serj 的评论)【参考方案5】:
在一个类中你可以这样称呼它:
public static string GetIPAddress(HttpRequestBase request)
string ip;
try
ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ip))
if (ip.IndexOf(",") > 0)
string[] ipRange = ip.Split(',');
int le = ipRange.Length - 1;
ip = ipRange[le];
else
ip = request.UserHostAddress;
catch ip = null;
return ip;
我在剃须刀应用程序中使用了它,效果很好。
【讨论】:
为什么从 HTTP_X_FORWARDED_FOR 返回最后一个地址?是不是客户地址不是第一个? 客户端是第一个,此代码错误,您将使用此代码获取最后一个代理IP【参考方案6】:我如何说明我的网站位于 Amazon AWS Elastic Load Balancer (ELB) 后面:
public class GetPublicIp
/// <summary>
/// account for possbility of ELB sheilding the public IP address
/// </summary>
/// <returns></returns>
public static string Execute()
try
Console.WriteLine(string.Join("|", new List<object>
HttpContext.Current.Request.UserHostAddress,
HttpContext.Current.Request.Headers["X-Forwarded-For"],
HttpContext.Current.Request.Headers["REMOTE_ADDR"]
)
);
var ip = HttpContext.Current.Request.UserHostAddress;
if (HttpContext.Current.Request.Headers["X-Forwarded-For"] != null)
ip = HttpContext.Current.Request.Headers["X-Forwarded-For"];
Console.WriteLine(ip + "|X-Forwarded-For");
else if (HttpContext.Current.Request.Headers["REMOTE_ADDR"] != null)
ip = HttpContext.Current.Request.Headers["REMOTE_ADDR"];
Console.WriteLine(ip + "|REMOTE_ADDR");
return ip;
catch (Exception ex)
Console.Error.WriteLine(ex.Message);
return null;
【讨论】:
以上是关于ASP.NET中如何获取客户端电脑名,数据库,ip等信息?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET CORE 3.1 中获取客户端 IP 地址?
如何在 ASP.NET MVC 中获取客户端的 IP 地址?