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 中获取客户端 IP ?

如何在 ASP.NET CORE 3.1 中获取客户端 IP 地址?

如何在 ASP.NET MVC 中获取客户端的 IP 地址?

用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址

如何从 ASP.NET 中的请求中获取 IP 地址?

如何在 ASP.NET Core 2.1 中获取客户端 IP 地址