2015-10-10 28 views
11

Nếu một giải nén giá trị HOST từ bộ sưu tập HttpContext của HttpRequest's Headers, có cách xác định xem giá trị trả về có phải là tên được giải quyết DNS hay không. ?Xác định xem Máy chủ có phải là tên DNS được giải quyết hay IP

Ví dụ cách dùng

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

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

Tóm tắt

Rõ ràng là người ta có thể làm một bài kiểm tra mẫu regex vào kết quả để tìm kiếm một mô hình IP, nhưng là có một tài sản trên HttpContext hoặc nhiều khả năng là HttpRequest hoặc thậm chí là phương pháp tĩnh bên ngoài của lớp trợ giúp có thể thực hiện quyết định đó thay thế?

+0

Có thể câu hỏi phụ trợ có thể là, cách thức .Net có thể nhận danh sách DNS không? Mặc dù rất lớn ... – OmegaMan

+2

Tiêu đề máy chủ được gửi bởi ứng dụng khách (https://en.wikipedia.org/wiki/List_of_HTTP_header_fields). Từ phía máy chủ, bạn có thể sử dụng Request.UserHostName và/hoặc Request.UserHostAddress thay vì sử dụng tiêu đề khách hàng? –

+0

Tôi không hiểu mục đích đọc giá trị HOST vì nó sẽ giống như nơi máy chủ của bạn được triển khai trừ khi nó đang ngồi phía sau Trình cân bằng tải trên một máy chủ khác khi máy chủ xử lý yêu cầu. Một cách bạn có thể làm là sử dụng Dns.GetHostName() để lấy Tên máy chủ của máy nơi câu lệnh này được thực thi để so sánh với giá trị bạn đã đọc từ tiêu đề HOST – Gururaj

Trả lời

4

Làm thế nào về Uri.CheckHostName()?

Trả về số System.UriHostNameType.

Ví dụ:

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

Tất nhiên, để sử dụng theo cách bạn gợi ý, cách dễ nhất là để tạo ra một phần mở rộng, như vậy:

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

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

Và đây là kết quả:

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

Một cách để bạn có thể làm là sử dụng Dns.GetHostName() để có được tên máy của máy mà tuyên bố này được thực hiện để so sánh với giá trị mà bạn đã đọc từ đầu HOST - một cái gì đó như thế này

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

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

Bạn có thể tận dụng lợi thế của System.Net.IPAddress.TryParse Method (String, IPAddress) và tạo một phương thức mở rộng để thực hiện chức năng mong muốn.

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

này bây giờ cho phép sau

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

if (host.IsIPAddress()) { 
    //...valid ip address 
} 
Các vấn đề liên quan