📜  客户端机器IIS的asp net saber ip地址 - C#(1)

📅  最后修改于: 2023-12-03 15:39:08.790000             🧑  作者: Mango

客户端机器IIS的ASP.NET服务器IP地址 - C#

由于ASP.NET Web应用程序在Web服务器上运行,获取服务器的IP地址是一项基本任务,下面介绍如何在C#中获取客户端机器IIS的ASP.NET服务器的IP地址。

步骤
Step 1

从WebRequest对象中获取IIS信息提供程序接口。

首先,我们需要从WebRequest对象中获取IIS信息提供程序接口来访问IIS(Internet 信息服务)。为此,我们可以利用以下代码:

var app = HttpContext.Current?.ApplicationInstance;
var workerReq = app?.GetType().GetProperty("WorkerRequest")?.GetValue(app);
var provider = workerReq?.GetType()
    .GetMethod("GetProvider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
    ?.Invoke(workerReq, new object[] { "IISWASOnlyProvider" });

注意此处HttpContext.Current在非web项目下会报错,但这不影响我们对接下来的步骤进行讲解与演示。

Step 2

使用ServerBindings属性获取IIS服务器列表。

现在,我们有了一个指向IISProvider的指针,可以获取服务器列表并查找其中一个。以下示例演示如何获取ServerBindings,该属性是一个包含服务器名称,端口和主机头的字符串数组。

var type = provider?.GetType();
var serverBindings = type?.GetProperty("ServerBindings")?.GetValue(provider) as string[];
Step 3

解析并返回服务器IP地址。

现在,我们具有了解析服务器名称的工具,可以使用.NET System.Net.Sockets命名空间中的类来查找每个服务器的IP地址。以下示例演示如何将IIS服务器列表转换为IP地址列表:

var ips = new List<string>();
foreach (var binding in serverBindings)
{
    var pieces = binding.Split(':');
    if (pieces.Length == 3 && pieces[0] != "")
    {
        ips.Add(Dns.GetHostAddresses(pieces[0]).First().ToString());
    }
}

return ips;
完整示例代码:
using System.Collections.Generic;
using System.Linq;
using System.Net;

public static class IISIPAddress
{
    public static List<string> GetIISIPAddress()
    {
        var app = HttpContext.Current?.ApplicationInstance;
        var workerReq = app?.GetType().GetProperty("WorkerRequest")?.GetValue(app);
        var provider = workerReq?.GetType()
            .GetMethod("GetProvider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
            ?.Invoke(workerReq, new object[] { "IISWASOnlyProvider" });

        var type = provider?.GetType();
        var serverBindings = type?.GetProperty("ServerBindings")?.GetValue(provider) as string[];

        var ips = new List<string>();
        foreach (var binding in serverBindings)
        {
            var pieces = binding.Split(':');
            if (pieces.Length == 3 && pieces[0] != "")
            {
                ips.Add(Dns.GetHostAddresses(pieces[0]).First().ToString());
            }
        }

        return ips;
    }
}
结论

上述步骤演示了如何在C#中获取客户端机器IIS的ASP.NET服务器的IP地址,并提供了完整的示例代码和说明,希望对您有所帮助。