2017-10-03 1 views
0

J'essaie de récupérer la carte réseau actuellement utilisée. Par exemple, si je reçois une requête Web dans ASP.NET Core, je veux savoir quelle carte est utilisée pour gérer cette requête.Obtenir la carte réseau en cours d'utilisation

Merci!

+0

Qu'avez-vous essayé jusqu'à présent? – BACON

+0

J'ai pensé à "netstat" et à lier au processus puis au filtrage par ip client distant (ce que j'ai) mais cela serait lent à cause de l'analyse syntaxique et de l'exécution, incompatibles sur Linux (devoir analyser une sortie différente). J'ai essayé de lancer un nouveau UdpClient mais comme Scott l'a mentionné, ce n'est pas fiable car on ne sait pas vraiment quelle NIC sera sélectionnée par le pilote Windows TCP/IP du noyau. J'ai lu à ce sujet et il semble que l'algorithme de décision NIC donne une priorité claire pour le même processus sur un NIC utilisé précédemment, donc il fonctionnera probablement la plupart du temps, mais nous ne pouvons pas vraiment compter dessus. –

+0

Aussi, je pensais à tromper l'algorithme d'équilibrage NIC en créant un UdpClient avec l'IP de destination le même que l'utilisateur distant (que je peux facilement récupérer en inspectant la requête HTTP). Cela signifie un socket sur le même processus à la même adresse IP distante. La chose est que je ne sais pas si le constructeur UdpClient sélectionne vraiment une carte réseau avant d'invoquer .connect() ou est-ce juste une carte réseau par défaut fictive, ce qui sera probablement le cas car c'est vraiment rapide. En outre, il peut être hors de contrôle C# de toute façon, décidé par le noyau. Chose étrange MSFT n'a pas d'interface exposant quelle carte réseau est utilisée. –

Répondre

1

Vous pouvez utiliser le HttpContext.Connection.LocalIpAddress property pour obtenir l'adresse IP de l'extrémité locale (serveur) de la connexion, puis rechercher l'instance NetworkInterface à laquelle est liée la même adresse.

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

Accès http://localhost:12345/Home/GetInterfaceInfo produit alors ...

{ 
    "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 
    } 
} 

La classe IgnorePropertyExceptionsResolver vient de Ignoring class members that throw exceptions when serializing to JSON et ressemble à ceci ...

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

La raison pour laquelle j'utilise cette classe est parce que certains des objets IPAddress dans les propriétés de collection de results.IPInterfaceProperties lèverait une exception lorsque leur La propriété Address a été accédée, de sorte que résolveur omet simplement les propriétés incriminées pour que la sortie fonctionne. Bien sûr, vous accéderez directement à ces objets et ne les convertirez pas en JSON, donc cette classe n'est vraiment nécessaire que pour ce code de démonstration.

+0

Merci Bacon, le problème est pour moi J'essaie de créer une classe d'assistance globale qui va enregistrer certaines données réseau. HttpContext n'existe pas dans le runtime Azure Functions, par conséquent je ne peux l'utiliser que pour ASP.NET Core.Merci à un journal pour la réponse, je pourrais simplement convertir HttpRequest Azure Function à la demande HttpRequest par défaut. Merci! –