Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取当前正在使用的网络适配器_C#_Asp.net Core_.net Core - Fatal编程技术网

C# 获取当前正在使用的网络适配器

C# 获取当前正在使用的网络适配器,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我正在尝试获取当前使用的网络适配器。 例如,如果我在ASP.NET Core中接收到一个web请求,我想知道使用哪个适配器来处理该请求 谢谢 您可以使用获取连接的本地(服务器)端的IP地址,然后查找绑定了相同地址的实例 using System.Linq; using System.Net.NetworkInformation; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; namespace WebApplication1.Co

我正在尝试获取当前使用的网络适配器。 例如,如果我在ASP.NET Core中接收到一个web请求,我想知道使用哪个适配器来处理该请求

谢谢

您可以使用获取连接的本地(服务器)端的IP地址,然后查找绑定了相同地址的实例

using System.Linq;
using System.Net.NetworkInformation;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult GetInterfaceInfo()
        {
            var connectionLocalAddress = HttpContext.Connection.LocalIpAddress;
            var connectionLocalInterface = NetworkInterface.GetAllNetworkInterfaces()
                .Where(iface => iface.GetIPProperties().UnicastAddresses.Any(unicastInfo => unicastInfo.Address.Equals(connectionLocalAddress)))
                .SingleOrDefault();
            var results = new {
                NetworkInterface = connectionLocalInterface,
                IPInterfaceProperties = connectionLocalInterface?.GetIPProperties(),
                IPInterfaceStatistics = connectionLocalInterface?.GetIPStatistics(),
                IPv4InterfaceStatistics = connectionLocalInterface?.GetIPv4Statistics()
            };

            return Json(
                results,
                new JsonSerializerSettings() {
                    ContractResolver = new IgnorePropertyExceptionsResolver(),
                    Formatting = Formatting.Indented
                }
            );
        }
    }
}
访问
http://localhost:12345/Home/GetInterfaceInfo
然后生成

{
    "NetworkInterface": {
        "Id": "{01234567-ABCD-EF01-2345-6789ABCDEF01}",
        "Name": "Loopback Pseudo-Interface 1",
        "Description": "Software Loopback Interface 1",
        "NetworkInterfaceType": 24,
        "OperationalStatus": 1,
        "Speed": 1073741824,
        "IsReceiveOnly": false,
        "SupportsMulticast": true
    },
    "IPInterfaceProperties": {
        "IsDnsEnabled": false,
        "IsDynamicDnsEnabled": true,
        "DnsSuffix": "",
        "AnycastAddresses": [],
        "UnicastAddresses": [
            {
                "Address": {
                    "AddressFamily": 23,
                    "ScopeId": 0,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false
                },
                "IPv4Mask": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 0
                },
                "PrefixLength": 128,
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 2,
                "SuffixOrigin": 2,
                "DuplicateAddressDetectionState": 4,
                "AddressValidLifetime": 4294967295,
                "AddressPreferredLifetime": 4294967295,
                "DhcpLeaseLifetime": 1542939
            },
            {
                "Address": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 16777343
                },
                "IPv4Mask": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 255
                },
                "PrefixLength": 8,
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 2,
                "SuffixOrigin": 2,
                "DuplicateAddressDetectionState": 4,
                "AddressValidLifetime": 4294967295,
                "AddressPreferredLifetime": 4294967295,
                "DhcpLeaseLifetime": 1542939
            }
        ],
        "MulticastAddresses": [
            {
                "Address": {
                    "AddressFamily": 23,
                    "ScopeId": 1,
                    "IsIPv6Multicast": true,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false
                },
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 0,
                "SuffixOrigin": 0,
                "DuplicateAddressDetectionState": 0,
                "AddressValidLifetime": 0,
                "AddressPreferredLifetime": 0,
                "DhcpLeaseLifetime": 0
            },
            {
                "Address": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 4211081199
                },
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 0,
                "SuffixOrigin": 0,
                "DuplicateAddressDetectionState": 0,
                "AddressValidLifetime": 0,
                "AddressPreferredLifetime": 0,
                "DhcpLeaseLifetime": 0
            }
        ],
        "DnsAddresses": [
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            },
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            },
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            }
        ],
        "GatewayAddresses": [],
        "DhcpServerAddresses": [],
        "WinsServersAddresses": []
    },
    "IPInterfaceStatistics": {
        "OutputQueueLength": 0,
        "BytesSent": 0,
        "BytesReceived": 0,
        "UnicastPacketsSent": 0,
        "UnicastPacketsReceived": 0,
        "NonUnicastPacketsSent": 0,
        "NonUnicastPacketsReceived": 0,
        "IncomingPacketsDiscarded": 0,
        "OutgoingPacketsDiscarded": 0,
        "IncomingPacketsWithErrors": 0,
        "OutgoingPacketsWithErrors": 0,
        "IncomingUnknownProtocolPackets": 0
    },
    "IPv4InterfaceStatistics": {
        "OutputQueueLength": 0,
        "BytesSent": 0,
        "BytesReceived": 0,
        "UnicastPacketsSent": 0,
        "UnicastPacketsReceived": 0,
        "NonUnicastPacketsSent": 0,
        "NonUnicastPacketsReceived": 0,
        "IncomingPacketsDiscarded": 0,
        "OutgoingPacketsDiscarded": 0,
        "IncomingPacketsWithErrors": 0,
        "OutgoingPacketsWithErrors": 0,
        "IncomingUnknownProtocolPackets": 0
    }
}
IgnorePropertyExceptionsResolver
类来自并看起来像这样

using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace WebApplication1.Controllers
{
    internal class IgnorePropertyExceptionsResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var jsonProperty = base.CreateProperty(member, memberSerialization);

            jsonProperty.ShouldSerialize = instance => {
                try
                {
                    var instanceProperty = (PropertyInfo) member;

                    if (instanceProperty.CanRead)
                    {
                        instanceProperty.GetValue(instance, null);

                        return true;
                    }
                }
                catch
                {
                }

                return false;
            };

            return jsonProperty;
        }
    }
}
我使用此类的原因是因为
results的集合属性中的一些
IPAddress
对象。当访问它们的
Address
属性时,IPInterfaceProperties
会引发异常,因此解析器只会忽略有问题的属性以使输出正常工作。当然,您将直接访问这些对象,而不是首先将它们转换为JSON,因此该类仅适用于此演示代码。

您可以使用获取连接的本地(服务器)端的IP地址,然后找到绑定了相同地址的实例

using System.Linq;
using System.Net.NetworkInformation;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult GetInterfaceInfo()
        {
            var connectionLocalAddress = HttpContext.Connection.LocalIpAddress;
            var connectionLocalInterface = NetworkInterface.GetAllNetworkInterfaces()
                .Where(iface => iface.GetIPProperties().UnicastAddresses.Any(unicastInfo => unicastInfo.Address.Equals(connectionLocalAddress)))
                .SingleOrDefault();
            var results = new {
                NetworkInterface = connectionLocalInterface,
                IPInterfaceProperties = connectionLocalInterface?.GetIPProperties(),
                IPInterfaceStatistics = connectionLocalInterface?.GetIPStatistics(),
                IPv4InterfaceStatistics = connectionLocalInterface?.GetIPv4Statistics()
            };

            return Json(
                results,
                new JsonSerializerSettings() {
                    ContractResolver = new IgnorePropertyExceptionsResolver(),
                    Formatting = Formatting.Indented
                }
            );
        }
    }
}
访问
http://localhost:12345/Home/GetInterfaceInfo
然后生成

{
    "NetworkInterface": {
        "Id": "{01234567-ABCD-EF01-2345-6789ABCDEF01}",
        "Name": "Loopback Pseudo-Interface 1",
        "Description": "Software Loopback Interface 1",
        "NetworkInterfaceType": 24,
        "OperationalStatus": 1,
        "Speed": 1073741824,
        "IsReceiveOnly": false,
        "SupportsMulticast": true
    },
    "IPInterfaceProperties": {
        "IsDnsEnabled": false,
        "IsDynamicDnsEnabled": true,
        "DnsSuffix": "",
        "AnycastAddresses": [],
        "UnicastAddresses": [
            {
                "Address": {
                    "AddressFamily": 23,
                    "ScopeId": 0,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false
                },
                "IPv4Mask": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 0
                },
                "PrefixLength": 128,
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 2,
                "SuffixOrigin": 2,
                "DuplicateAddressDetectionState": 4,
                "AddressValidLifetime": 4294967295,
                "AddressPreferredLifetime": 4294967295,
                "DhcpLeaseLifetime": 1542939
            },
            {
                "Address": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 16777343
                },
                "IPv4Mask": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 255
                },
                "PrefixLength": 8,
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 2,
                "SuffixOrigin": 2,
                "DuplicateAddressDetectionState": 4,
                "AddressValidLifetime": 4294967295,
                "AddressPreferredLifetime": 4294967295,
                "DhcpLeaseLifetime": 1542939
            }
        ],
        "MulticastAddresses": [
            {
                "Address": {
                    "AddressFamily": 23,
                    "ScopeId": 1,
                    "IsIPv6Multicast": true,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false
                },
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 0,
                "SuffixOrigin": 0,
                "DuplicateAddressDetectionState": 0,
                "AddressValidLifetime": 0,
                "AddressPreferredLifetime": 0,
                "DhcpLeaseLifetime": 0
            },
            {
                "Address": {
                    "AddressFamily": 2,
                    "IsIPv6Multicast": false,
                    "IsIPv6LinkLocal": false,
                    "IsIPv6SiteLocal": false,
                    "IsIPv6Teredo": false,
                    "IsIPv4MappedToIPv6": false,
                    "Address": 4211081199
                },
                "IsTransient": false,
                "IsDnsEligible": false,
                "PrefixOrigin": 0,
                "SuffixOrigin": 0,
                "DuplicateAddressDetectionState": 0,
                "AddressValidLifetime": 0,
                "AddressPreferredLifetime": 0,
                "DhcpLeaseLifetime": 0
            }
        ],
        "DnsAddresses": [
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            },
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            },
            {
                "AddressFamily": 23,
                "ScopeId": 1,
                "IsIPv6Multicast": false,
                "IsIPv6LinkLocal": false,
                "IsIPv6SiteLocal": true,
                "IsIPv6Teredo": false,
                "IsIPv4MappedToIPv6": false
            }
        ],
        "GatewayAddresses": [],
        "DhcpServerAddresses": [],
        "WinsServersAddresses": []
    },
    "IPInterfaceStatistics": {
        "OutputQueueLength": 0,
        "BytesSent": 0,
        "BytesReceived": 0,
        "UnicastPacketsSent": 0,
        "UnicastPacketsReceived": 0,
        "NonUnicastPacketsSent": 0,
        "NonUnicastPacketsReceived": 0,
        "IncomingPacketsDiscarded": 0,
        "OutgoingPacketsDiscarded": 0,
        "IncomingPacketsWithErrors": 0,
        "OutgoingPacketsWithErrors": 0,
        "IncomingUnknownProtocolPackets": 0
    },
    "IPv4InterfaceStatistics": {
        "OutputQueueLength": 0,
        "BytesSent": 0,
        "BytesReceived": 0,
        "UnicastPacketsSent": 0,
        "UnicastPacketsReceived": 0,
        "NonUnicastPacketsSent": 0,
        "NonUnicastPacketsReceived": 0,
        "IncomingPacketsDiscarded": 0,
        "OutgoingPacketsDiscarded": 0,
        "IncomingPacketsWithErrors": 0,
        "OutgoingPacketsWithErrors": 0,
        "IncomingUnknownProtocolPackets": 0
    }
}
IgnorePropertyExceptionsResolver
类来自并看起来像这样

using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace WebApplication1.Controllers
{
    internal class IgnorePropertyExceptionsResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var jsonProperty = base.CreateProperty(member, memberSerialization);

            jsonProperty.ShouldSerialize = instance => {
                try
                {
                    var instanceProperty = (PropertyInfo) member;

                    if (instanceProperty.CanRead)
                    {
                        instanceProperty.GetValue(instance, null);

                        return true;
                    }
                }
                catch
                {
                }

                return false;
            };

            return jsonProperty;
        }
    }
}

我使用此类的原因是因为
results的集合属性中的一些
IPAddress
对象。当访问它们的
Address
属性时,IPInterfaceProperties
会引发异常,因此解析器只会忽略有问题的属性以使输出正常工作。当然,您将直接访问这些对象,而不是首先将它们转换为JSON,因此该类仅适用于此演示代码。

我考虑过“netstat”并链接到进程,然后通过远程客户端ip进行过滤(我确实有),但由于解析和执行的原因,速度会很慢,在Linux上不兼容(必须分析不同的输出)。我尝试启动一个新的UdpClient。正如Scott提到的,它不可靠,因为我们不知道Windows TCP/IP内核驱动程序将选择哪个NIC。我了解到,NIC决策算法似乎为以前使用的NIC上的同一进程提供了明确的优先级,因此它可能在大多数情况下都会工作,但我们另外,我想通过创建一个UdpClient来欺骗NIC平衡算法,该UdpClient的目标IP与远程用户相同(我可以通过检查HTTP请求轻松获取)。这将意味着同一进程上的套接字连接到同一远程IP。问题是,我不知道UdpClient构造函数在调用.connect()之前是否真的选择了NIC或者它只是一个虚拟的默认NIC,可能会是这种情况,因为它非常快。而且,它可能会失去C#控制,这是由内核决定的。奇怪的是,MSFT没有一个接口公开正在使用哪个NIC。刚刚读完一些核心代码,UdpClient似乎正在构造一个据我所知,Windows TCP/IP驱动程序在创建套接字时选择NIC,这基本上意味着创建一个UdpClient实例,指向远程IP(我们从HTTP请求中知道)will很有可能会被分配到为传入数据包选择的同一个NIC。仍然需要一些挖掘,但对大多数人来说似乎已经足够好了。使用and获取本地IP地址,然后将其与的结果进行匹配,是否会为您提供所需的信息?感谢您的建议,will会这样做,并将更新e、 顺便说一句,HttpContext在Azure Functions runtime与.NET Core配合使用后是否可以工作?谢谢。我考虑过“netstat”并链接到进程,然后通过远程客户端ip(我确实有)进行过滤,但由于解析和执行的原因,速度会很慢,在Linux上不兼容(必须解析不同的输出)。我尝试启动一个新的UdpClient。正如Scott提到的,它不可靠,因为我们不知道Windows TCP/IP内核驱动程序将选择哪个NIC。我了解到,NIC决策算法似乎为以前使用的NIC上的同一进程提供了明确的优先级,因此它可能在大多数情况下都会工作,但我们另外,我想通过创建一个UdpClient来欺骗NIC平衡算法,该UdpClient的目标IP与远程用户相同(我可以通过检查HTTP请求轻松获取)。这将意味着同一进程上的套接字连接到同一远程IP。问题是,我不知道UdpClient构造函数在调用.connect()之前是否真的选择了NIC或者它只是一个虚拟的默认NIC,可能会是这种情况,因为它非常快。而且,它可能会失去C#控制,这是由内核决定的。奇怪的是,MSFT没有一个接口公开正在使用哪个NIC。刚刚读完一些核心代码,UdpClient似乎正在构造一个据我所知,Windows TCP/IP驱动程序在创建套接字时选择NIC,这基本上意味着创建一个UdpClient实例,指向远程IP(我们从HTTP请求中知道)will很有可能会被分配到为传入数据包选择的同一个NIC。仍然需要一些挖掘,但对大多数人来说似乎已经足够好了。使用and获取本地IP地址,然后将其与的结果进行匹配,是否会为您提供所需的信息?感谢您的建议,will会这样做,并将更新e、 顺便说一句,HttpContext与.NET Core一起使用后,是否可以用于Azure Functions runtime?谢谢。感谢Bacon,问题是我正在尝试创建一个全局帮助器类来记录一些网络数据。HttpContext在Azure Functions runtime中不存在,因此我