System.Uri
có Host
, Authority
và DnsSafeHost
. MS cung cấp một ví dụ hay về thời điểm Host
và DnsSafeHost
sự khác biệt ở đây .
Tôi muốn một ví dụ / giải thích tương tự cho Host
và Authority
.
Câu trả lời:
Có Brandon là hoàn toàn chính xác, theo thuật ngữ giáo dân
Cơ quan = Tên máy chủ + Số cổng
Và nếu giao thức URL đang sử dụng một cổng mặc định, giả sử cổng 80 cho URL http, thì chỉ trong trường hợp đó Authority = Host Name (Số cổng được giả định là 80),
Trong khi Tên máy chủ lưu trữ là Tên miền hoặc Địa chỉ IP
Thí dụ:
http://www.example.com/
Authority = www.example.com
Host Name = www.example.com
http://255.255.255.255:8080/
Cơ quan = 255.255.255.255:8080
Tên máy chủ = 255.255.255.255
User Information
một phần.
Từ trang MSDN URI.Host .
Không giống như thuộc tính Authority, giá trị thuộc tính này không bao gồm số cổng.
Mọi URL HTTP đều tuân theo cú pháp của một URI chung. Cú pháp chung của URI bao gồm một chuỗi phân cấp gồm năm thành phần:
URI = scheme:[//authority]path[?query][#fragment]
trong đó thành phần quyền hạn chia thành ba thành phần con:
authority = [userinfo@]host[:port]
Như thế này:
Thành phần quyền hạn tùy chọn đứng trước hai dấu gạch chéo (//), bao gồm:
Để biết thêm chi tiết, bạn có thể tham khảo https://vi.wikipedia.org/wiki/URL .
Đối với lớp Uri trong .NET, Authority bao gồm cổng, Host thì không và cũng không bao gồm thông tin người dùng.
Một số ví dụ về các URI hợp lệ:
Uri u = new Uri("http://www.domain.com/path");
Assert.AreEqual("www.domain.com", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com", u.GetLeftPart(UriPartial.Authority));
u = new Uri("http://www.domain.com:8080/path");
Assert.AreEqual("www.domain.com:8080", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com:8080", u.GetLeftPart(UriPartial.Authority));
u = new Uri("http://user:password@host:555/path");
Assert.AreEqual("host:555", u.Authority);
Assert.AreEqual("host", u.Host);
Assert.AreEqual("http://user:password@host:555", u.GetLeftPart(UriPartial.Authority));
Theo RFC3986 , Phần 3.2 Cơ quan có
KHÔNG chỉ máy chủ và số cổng.
Ví dụ: sau đây là một URI hợp lệ:
http://user:password@host:80/path
trong đó Cơ quan là
user:password@host:80
Biểu tượng at (@) phân định thông tin người dùng khỏi máy chủ và dấu hai chấm (:) phân định máy chủ với số cổng. Trong thông tin người dùng, dấu hai chấm (:) phân tách tên người dùng khỏi mật khẩu. (Có, tôi biết phần mật khẩu không được dùng nữa. Nó có thể vẫn được hỗ trợ tùy ý.)
Đây là thông số kỹ thuật đầy đủ cho một Cơ quan. Rõ ràng, thông tin người dùng và số cổng thường không có.
Lớp Uri trong .NET bỏ thông tin người dùng khi trả về Authority, điều này khá khó chịu vì nó không chính xác. Thay vào đó, bạn có thể tìm thấy thông tin người dùng trong thuộc tính UserInfo:
Uri.UserInfo
Các câu trả lời khác đúng về mặt kỹ thuật khi nói rằng đối với lớp .NET Uri , sự khác biệt giữa Uri.Authority và Uri.Host là máy chủ lưu trữ sẽ không chứa số cổng.
Nhưng hãy biết rằng Authority không được định nghĩa đúng cách nó được sử dụng trong lớp .NET Uri vì nó cũng có thể chứa thông tin người dùng.
Theo tài liệu bạn đã liên kết, thuộc Authority
tính sẽ bao gồm số cổng nếu nó không giống với cổng mặc định của Uri, trong khi thuộc Host
tính sẽ chỉ trả về tên Máy chủ DNS hoặc Địa chỉ IP.
Tôi không tin có sự khác biệt nào hơn thế.
Quyền hạn cũng có thể bao gồm tên người dùng và mật khẩu, ví dụ:
bob: pwd@somewhere.example.com
được sử dụng phổ biến hơn cho các URI FTP