Sự khác biệt giữa Uri.Host và Uri.Authority


82

System.UriHost, AuthorityDnsSafeHost. MS cung cấp một ví dụ hay về thời điểm HostDnsSafeHostsự khác biệt ở đây .

Tôi muốn một ví dụ / giải thích tương tự cho HostAuthority.

Câu trả lời:


103

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ụ:

  1. http://www.example.com/

    Authority = www.example.com
    Host Name = www.example.com

  2. http://255.255.255.255:8080/

    Cơ quan = 255.255.255.255:8080
    Tên máy chủ = 255.255.255.255


1
Một nghi ngờ nhỏ. nếu tôi chạy ứng dụng trong localhost, tôi có số cổng trong URL của mình nhưng trong quá trình sản xuất, tôi không có số cổng trong URL. Vì vậy, tôi có thể thoải mái sử dụng Url.Authority phải không? Ý tôi là nếu số cổng không có ở đó thì URl.Authority sẽ hoạt động giống như URL. Ý tôi là tôi vẫn có thể lấy đúng URL đúng không? xin vui lòng hướng dẫn cho tôi,.
Unbreakable

Đọc stackoverflow.com/a/39415643/316343 , nó bị thiếu User Informationmột phần.
Jahan

35

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ột nghi ngờ nhỏ. nếu tôi chạy ứng dụng trong localhost, tôi có số cổng trong URL của mình nhưng trong quá trình sản xuất, tôi không có số cổng trong URL. Vì vậy, tôi có thể thoải mái sử dụng Url.Authority phải không? Ý tôi là nếu số cổng không có ở đó thì URl.Authority sẽ hoạt động giống như URL. Ý tôi là tôi vẫn có thể lấy đúng URL đúng không? xin vui lòng hướng dẫn cho tôi.
Unbreakable

@Unbreakable - Đúng vậy, nó sẽ hoạt động cho cả hai trường hợp. Khi bạn không chỉ định số cổng trong url, bạn chỉ sử dụng số cổng mặc định và trong trường hợp đó Url.Authority bỏ qua cổng.
BornToCode

15

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:

wiki

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:

  • Thành phần con userinfo tùy chọn có thể bao gồm tên người dùng và mật khẩu tùy chọn đặt trước dấu hai chấm (:), theo sau là ký hiệu at (@). Sử dụng tên người dùng định dạng: mật khẩu trong thành phần con userinfo không được dùng nữa vì lý do bảo mật. Các ứng dụng không được hiển thị dưới dạng văn bản rõ ràng bất kỳ dữ liệu nào sau dấu hai chấm đầu tiên (:) được tìm thấy trong thành phần con userinfo trừ khi dữ liệu sau dấu hai chấm là chuỗi trống (cho biết không có mật khẩu).
  • Thành phần con máy chủ tùy chọn , bao gồm tên đã đăng ký (bao gồm nhưng không giới hạn ở tên máy chủ) hoặc địa chỉ IP. Địa chỉ IPv4 phải có ký hiệu dấu chấm-thập phân và địa chỉ IPv6 phải được đặt trong dấu ngoặc ([]).
  • Thành phần con cổng tùy chọn đứng trước dấu hai chấm (:).

Để biết thêm chi tiết, bạn có thể tham khảo https://vi.wikipedia.org/wiki/URL .


12

Đố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ó

  1. Thông tin người dùng
  2. Tổ chức
  3. Số cổng.

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.


10

Theo tài liệu bạn đã liên kết, thuộc Authoritytí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 Hosttí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ế.


1
Một nghi ngờ nhỏ. nếu tôi chạy ứng dụng trong localhost, tôi có số cổng trong URL của mình nhưng trong quá trình sản xuất, tôi không có số cổng trong URL. Vì vậy, tôi có thể thoải mái sử dụng Url.Authority phải không? Ý tôi là nếu số cổng không có ở đó thì URl.Authority sẽ hoạt động giống như URL. Ý tôi là tôi vẫn có thể lấy đúng URL đúng không? xin vui lòng hướng dẫn cho tôi.
Unbreakable

0

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


xin lỗi, bạn sai rồi. Từ RFC 3986 phần 3.2 Cơ quan "Authority = [userinfo" @ "] host [": "port]"
Adrien

thông tin người dùng với mật khẩu thuần túy không được chấp nhận trong RFC nhưng vẫn được sử dụng phổ biến, đặc biệt là với FTP URI và IE vẫn hỗ trợ điều này (trên thực tế, đó là cách duy nhất để xác thực với FTP qua IE thông qua proxy http).
Adrien

4
Câu hỏi là về System.URI.Authority, không giống với RFC 3986.
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.