2015-10-10 12 views
11

Jeśli ktoś jest wyodrębnianie wartości HOST z HttpContext „s HttpRequest” s Headers kolekcji, czy istnieje sposób określania, czy wartość zwracana jest nazwa rozwiązany DNS lub bezpośredni adres IP ?Ustal, czy Host został rozwiązany nazwa DNS lub IP

Przykład użycia

string host = HttpContext.Current.Request.Headers["HOST"]; 

if (host.IsIPAddress()) ... /// Something like this ? 
    or 
    (host.IsDNSResolved()) // Or this? 

Podsumowanie

Jest oczywiste, że można zrobić regex testu wzoru na skutek patrzenia na wzór IP, ale jest tam nieruchomość na HttpContext lub bardziej prawdopodobne jest, że metoda statyczna poza klasą pomocnika mogłaby zamiast tego wykonać to oznaczenie?

+0

Może być pomocnicze pytanie, jak w .Net można uzyskać listę DNS? Choć ogromny ... – OmegaMan

+2

Nagłówek hosta jest wysyłany przez klienta (https://en.wikipedia.org/wiki/List_of_HTTP_header_fields). Od strony serwera można użyć Request.UserHostName i/lub Request.UserHostAddress zamiast używać nagłówków klientów? –

+0

Nie rozumiałem celu odczytu wartości HOST, ponieważ będzie ona taka sama jak lokalizacja serwera, chyba że znajduje się za modułem równoważenia obciążenia na innym serwerze, jako serwer obsługujący żądanie. Jednym ze sposobów, w jaki można to zrobić, jest użycie metody Dns.GetHostName() w celu uzyskania nazwy hosta komputera, w którym wykonywana jest ta instrukcja w celu porównania z wartością odczytaną z nagłówka HOST – Gururaj

Odpowiedz

4

Jak o Uri.CheckHostName()?

To zwraca wartość System.UriHostNameType.

Przykład:

Uri.CheckHostName("127.0.0.1"); //=> IPv4 
Uri.CheckHostName("www.google.com"); //=> Dns 
Uri.CheckHostName("localhost"); //=> Dns 
Uri.CheckHostName("2000:2000:2000:2000::"); //=> IPv6 

Oczywiście, aby użyć sposób sugerowany, najprostszym sposobem jest stworzenie rozszerzenia, tak:

public static class UriExtension { 
     public static bool IsIPAddress(this string input) { 
      var hostNameType = Uri.CheckHostName(input); 

      return hostNameType == UriHostNameType.IPv4 || hostNameType == UriHostNameType.IPv6; 
     } 
    } 

A ta jest wynikiem:

"127.0.0.1".IsIPAddress(); //true 
"2000:2000:2000:2000::".IsIPAddress(); //true 
"www.google.com".IsIPAddress(); //false 
0

Jednym ze sposobów można to zrobić jest użycie Dns.GetHostName(), aby uzyskać nazwę hosta komputera, na którym oświadczenie to zostanie wykonany porównać z wartością czytałeś z nagłówka hosta - coś takiego

var host = HttpContext.Current.Request.Headers["HOST"]; 
var machineHostName = Dns.GetHostName(); 

if(host.ToLower().Equals(machineHostName.ToLower())) 
{ 
    // Perform your action here. 
} 
7

Możesz skorzystać z System.Net.IPAddress.TryParse Method (String, IPAddress) i utworzyć metodę rozszerzenia, aby wykonać żądaną funkcję.

public static class IpAddressExtension { 
    public static bool IsIPAddress(this string ipAddress) { 
     System.Net.IPAddress address = null; 
     return System.Net.IPAddress.TryParse(ipAddress, out address); 
    } 
} 

Pozwala to teraz następujące

string host = System.Web.HttpContext.Current.Request.Headers["HOST"]; 

if (host.IsIPAddress()) { 
    //...valid ip address 
} 
Powiązane problemy