2009-12-21 15 views
16

Xin chào tất cả, tôi dường như đã tìm thấy sự khác biệt khi thử nghiệm các ứng dụng ASP.NET cục bộ trên máy chủ web tích hợp với Visual Studio 2008 (Cassini).Tại sao yêu cầu ["host"] == "dev.testhost.com:1234" trong khi Request.Url.Host == "localhost"

tôi đã thiết lập một máy chủ trên máy tính địa phương của tôi gắn dev.testhost.com với 127.0.0.1, kể từ khi tôi có một ứng dụng mà cần phải thay đổi diện mạo của nó tùy thuộc vào tiêu đề máy chủ sử dụng để gọi nó.

Tuy nhiên, khi tôi yêu cầu đơn đăng ký thử nghiệm của mình sử dụng http://dev.testhost.com:1234/index.aspx, giá trị của Request.Url.Host luôn là "localhost". Trong khi giá trị của Request.Headers["host"]"dev.testhost.com:1234" (như tôi mong đợi chúng cả hai là).

Tôi KHÔNG lo ngại rằng giá trị thứ hai bao gồm các số cổng, nhưng tôi hùng mạnh bối rối là tại sao TÊN HOST là hoàn toàn khác nhau! Có ai biết nếu đây là một vấn đề được biết, hoặc bằng cách thiết kế? Hay tôi là một thằng ngốc ?!

Tôi muốn sử dụng Request.Url.Host, vì điều đó tránh phải loại bỏ số cổng khi thử nghiệm ... - Đã bị xóa do có thể gây nhầm lẫn! - Sam

+0

Từ tài liệu MSDN có vẻ như Request.Url phải được quan tâm với yêu cầu được gửi đến máy chủ. Trích dẫn từ http://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx ... > ** HttpRequest Class ** > Cho phép ASP.NET đọc các giá trị HTTP được gửi bởi một khách hàng trong một yêu cầu Web. Đó không phải là những gì có vẻ như đang diễn ra khi chạy trong Cassini ... Cảm ơn câu trả lời cho đến nay, nhưng tôi thực sự không tin rằng có bất kỳ lý do chính đáng nào cho tên máy chủ được báo cáo khác nhau cho cùng một yêu cầu đối tượng ... –

Trả lời

9

Request.Headers["host"] là giá trị nhận được từ ứng dụng kết nối với máy chủ, trong khi giá trị khác là giá trị khác mà máy chủ nhận được khi cố gắng lấy tên miền.

Trình duyệt sử dụng trong yêu cầu tên miền được nhập vì tên miền được nhập bởi vì tên miền được sử dụng trong trường hợp tên miền ảo. Máy chủ báo cáo một bộ trong tùy chọn máy chủ hoặc máy chủ đầu tiên được tìm thấy.

EDIT: Nhìn vào mã của Cassini để xem nếu nó sử dụng một số cài đặt cụ thể, tôi nhận thấy đoạn mã sau:

public string RootUrl { 
    get { 
    if (_port != 80) { 
     return "http://localhost:" + _port + _virtualPath; 
    } 
    else { 
     return "http://localhost" + _virtualPath; 
    } 
    } 
} 

// 
// Socket listening 
// 

public void Start() { 
    try { 
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, _port); 
    } 
    catch { 
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, _port); 
    } 
    // … 
} 

Lời giải thích có vẻ là rằng Cassini làm tài liệu tham khảo rõ ràng để localhost, và không cố thực hiện tra cứu DNS ngược. Khác biệt, nó sẽ không sử dụng return "http://localhost" + _virtualPath;.

+0

Vâng, địa chỉ IP của máy chủ là 127.0.0.1. Điều này có 2 máy được ánh xạ trong c: \ windows \ system32 \ drivers \ etc \ hosts: ** localhost ** và ** dev.testhost.com ** Tuy nhiên, khi tôi gõ 'dev.testhost.com' giá trị của 'HttpContect.Current.Request.Url.Host' là 'localhost'? Trên một máy chủ sản xuất, nó sẽ là bất cứ điều gì tôi gõ in Tại sao máy chủ thử nghiệm địa phương (Cassini) khác với máy chủ trực tiếp? –

+0

Thứ tự là các máy chủ được xác định? Có lẽ thứ tự ảnh hưởng đến thứ tự được báo cáo bởi máy chủ. – kiamlaluno

+0

Tôi vừa thử thay đổi thứ tự của máy chủ và điều này không có sự khác biệt! Mặc dù vậy, tôi nghĩ sẽ rất đáng ngạc nhiên nếu điều này có hiệu quả, vì điều đó có lẽ sẽ yêu cầu tra cứu DNS ngược lại nếu nó hoạt động ổn định, mà tôi nghi ngờ họ sẽ đưa vào một tài sản đơn giản ... Tôi nghi ngờ ở đó là một lỗi trong Cassini gây ra sự khác biệt này! –

1

Đó là vấn đề của những gì w3 specs nói so với những gì thuộc tính Microsoft Uri.Host được cho là chứa. Việc đặt tên không ngụ ý một nỗ lực của MS để cung cấp chức năng giống hệt nhau. Hàm bao gồm số cổng là Uri.Authority.

Với bản cập nhật bạn đã đăng, bạn vẫn phải đối mặt với cùng một vấn đề, chỉ cần kiểm tra khía cạnh khác của nó. Các Uri.Host property không phải là explicity hoặc implicity nói để thực hiện các chức năng tương tự như các tiêu đề được xác định trong thông số w3. Ở dạng dài, đây là một số trích dẫn từ trang Uri.Host MSDN:

Uri.Host tài sản
Gets thành phần máy chủ của trường hợp này.

Property Value

Loại: System.String

một chuỗi chứa tên máy chủ. Đây thường là tên máy chủ DNS hoặc địa chỉ IP của máy chủ.

Không đảm bảo rằng điều này sẽ khớp với những gì nằm trong tiêu đề, chỉ là nó đại diện cho tên máy chủ ở một dạng nào đó.

+0

Cảm ơn bạn đã cố gắng, nhưng bạn đã đọc sai câu hỏi, tôi đã thêm nhấn mạnh vào bit nói ** Tôi KHÔNG quan tâm đến giá trị thứ hai bao gồm số cổng ** –

+0

My câu trả lời vẫn có thể áp dụng được - tôi đã mở rộng nó để làm cho mối tương quan với bản cập nhật của bạn hiển nhiên hơn, nhưng vấn đề cơ bản của bạn là giả định rằng đối tượng 'System.Uri' phải khớp trực tiếp với tiêu đề http mà bạn đang truy xuất bằng' Yêu cầu .Headers'. – jball

+0

Đối tượng của lớp 'System.Uri' chỉ đại diện cho URI nói chung, câu hỏi của tôi là về cá thể' Request.Url' ** ** của lớp 'System.Uri', như được truy cập từ một trang aspx đang được hiển thị do yêu cầu cho một URL cụ thể. Điểm của thuộc tính 'Request.Uri' là gì nếu nó không khớp với Url của' Request'? Để làm rõ, bạn có thể gọi 'Request.Url.ToString()' và nó vẫn báo cáo 'http: // localhost: 1234/Default.aspx' trong khi yêu cầu là cho' http://dev.testhost.com: 1234/Default.aspx' ... –

8

Request.Headers["host"] là máy chủ được chỉ định trong tiêu đề http từ trình duyệt. (ví dụ: đây là những gì bạn thấy nếu bạn đã kiểm tra lưu lượng truy cập bằng Fiddler hoặc HttpWatch)

Tuy nhiên, ASP.NET sẽ giải thích (và các thông tin yêu cầu khác) thành một mẫu System.Uri. . Trong trường hợp này, "Máy chủ" nghĩa là phần máy chủ của yêu cầu ban đầu (ví dụ: với cổng tcp đang ở trong Cổng).

Lớp System.Uri này là lớp trợ giúp rất hữu ích, giúp bạn thoát khỏi yêu cầu của bạn thành các phần của nó, trong khi "Host:" (và cho rằng "GET") từ tiêu đề http chỉ là raw dữ liệu yêu cầu.

Mặc dù cả hai đều có cùng tên, chúng không có nghĩa là giống nhau.

+0

Cảm ơn câu trả lời của bạn, những gì tôi đang tự hỏi là làm thế nào 'chia nhỏ' http://dev.testhost.com:1234/ có thể dẫn đến mất hoàn toàn phần 'dev.testhost.com' và thay thế bằng 'localhost'? Câu hỏi của tôi không thực sự là về các lớp Uri hoặc UriBuilder, tôi hiểu rõ những điều đó;) Ngoài ra, ** số cổng không phải là vấn đề ở đây cả **. Tôi đã thêm ** nhấn mạnh ** vào đoạn thứ 3 của câu hỏi của tôi, có lẽ điều đó sẽ làm cho nó rõ ràng hơn? Cảm ơn một lần nữa;) –

+0

Vâng - bạn đã nói bạn đã liên kết dev.testhost.com với địa chỉ IP 127.0.0.1. Tuy nhiên, địa chỉ IP này luôn luôn ánh xạ tới localhost (theo định nghĩa - nó là địa chỉ loopback) - vì vậy mọi tra cứu tên trên 127.0.0.1 sẽ ánh xạ tới localhost. Khi bạn nói bạn "liên kết dev.testhost.com với 127.0.0.1" bạn đã làm điều này như thế nào? Bạn đã chỉnh sửa tệp máy chủ hay thực hiện theo cách khác? –

+0

Tôi đã thêm mục nhập trong tệp máy chủ. Xin vui lòng xem câu trả lời của kiamlaluno dưới đây ... Có vẻ như đây là một vấn đề cụ thể của Cassini ... –

Các vấn đề liên quan