C# 获取当前正在使用的网络适配器
我正在尝试获取当前使用的网络适配器。 例如,如果我在ASP.NET Core中接收到一个web请求,我想知道使用哪个适配器来处理该请求 谢谢 您可以使用获取连接的本地(服务器)端的IP地址,然后查找绑定了相同地址的实例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
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中不存在,因此我