2017-10-03 32 views
0

現在使用しているネットワークアダプタを取得しようとしています。 たとえば、ASP.NET CoreでWebリクエストを受け取っている場合、そのリクエストを処理するために使用されているアダプタを知りたいと思います。現在使用中のネットワークアダプタを取得

ありがとうございます!

+0

これまでに何を試しましたか? – BACON

+0

私は "netstat"について考えて、リモートクライアントIP(これは私が持っている)でフィルタリングしていましたが、それは解析と実行のために遅くなり、Linuxでは互換性がありません(別の出力を解析する必要があります)。スコット氏が述べたように私はまだ新しいUdpClientを立ち上げようとしましたが、Windows TCP/IPカーネルドライバによってどのNICが選択されるかわからないので信頼できません。私はそれについて読んで、それはNICの決定アルゴリズムは、以前に使用されたNIC上で同じプロセスのための明確な優先順位を与えるように思われるので、おそらくほとんどの時間は動作しますが、我々はそれに本当に数えることはできません。 –

+0

また、私は、リモートユーザと同じ宛先IPを持つUdpClientを作成することでNICバランスアルゴリズムを騙します(HTTPリクエストを調べて簡単に取得できます)。これは同じプロセス上の同じリモートIPへのソケットを意味します。問題は、.connect()を呼び出す前にUdpClientコンストラクタが本当にNICを選択しているのかどうかわかりません。それは本当に高速なのでおそらく大文字になるダミ​​ーのデフォルトNICです。また、カーネルによって決められたとにかく、C#制御から外れることもあります。奇妙なことMSFTには、どのNICが使用されているかを公開するインターフェイスはありません。 –

答えて

1

HttpContext.Connection.LocalIpAddress propertyを使用して、接続のローカル(サーバー)側のIPアドレスを取得し、同じアドレスがバインドされたNetworkInterfaceインスタンスを見つけることができます。 http://localhost:12345/Home/GetInterfaceInfoへのアクセス

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 
       } 
      ); 
     } 
    } 
} 

が、その後生産...

{ 
    "NetworkInterface": { 
     "Id": "{-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クラスがIgnoring class members that throw exceptions when serializing to JSONから来ているとこのようになります...私はこのクラスを使用

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; 
     } 
    } 
} 

理由はいくつかありますコレクションプロパティ内のIPAddressオブジェクトのうち、results.IPInterfacePropertiesが例外をスローするAddressプロパティがアクセスされたため、リゾルバは問題のあるプロパティを省略して出力を有効にします。もちろん、これらのオブジェクトに直接アクセスしてJSONに変換しないので、このデモコードではクラスが本当に必要になります。

+0

Baconさん、ありがとうございました。問題は私にとっては、いくつかのネットワークデータを記録するグローバルヘルパークラスを作成しようとしています。 HttpContextはAzure関数のランタイムには存在しません。そのため、私はASP.NETコアでのみ使用できます。回答のログをありがとう、私は単にAzure関数のHttpRequestをデフォルトのHttpRequestに変換するかもしれません。ありがとう! –

関連する問題