What's the difference between Uri.Host and Uri.Authority

System.Uri has Host, Authority, and DnsSafeHost. MS provides a nice example of when Host and DnsSafeHost are different here.

I'd like a similar example/explanation for Host and Authority.


Yes Brandon is absolutely correct, in layman terms

Authority = Host Name + Port No

And if URL protocol is using a default port, say port 80 for http URL, then only in that case Authority = Host Name (Port No is assumed to be 80),

Whereas Host Name is either Domain Name or I.P Address

Example:

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

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

  2. http://255.255.255.255:8080/

    Authority = 255.255.255.255:8080
    Host Name = 255.255.255.255


From MSDN URI.Host page.

Unlike the Authority property, this property value does not include the port number.


Every HTTP URL conforms to the syntax of a generic URI. The URI generic syntax consists of a hierarchical sequence of five components:

URI = scheme:[//authority]path[?query][#fragment]

where the authority component divides into three subcomponents:

authority = [userinfo@]host[:port]

Like this:

wiki

An optional authority component preceded by two slashes (//), comprising:

  • An optional userinfo subcomponent that may consist of a user name and an optional password preceded by a colon (:), followed by an at symbol (@). Use of the format username:password in the userinfo subcomponent is deprecated for security reasons. Applications should not render as clear text any data after the first colon (:) found within a userinfo subcomponent unless the data after the colon is the empty string (indicating no password).
  • An optional host subcomponent, consisting of either a registered name (including but not limited to a hostname), or an IP address. IPv4 addresses must be in dot-decimal notation, and IPv6 addresses must be enclosed in brackets ([]).
  • An optional port subcomponent preceded by a colon (:).

For more details, you can refer to https://en.wikipedia.org/wiki/URL .


For the Uri class in .NET, Authority includes the port, Host does not, and neither includes user information.

Some examples of valid URIs:

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));

According to RFC3986, Section 3.2 the Authority contains

  1. User Information
  2. Host
  3. Port number.

NOT just host and port number.

For example, the following is a valid URI:

http://user:password@host:80/path

in which the Authority is

user:password@host:80

The at symbol (@) delimits the user info from the host and the colon (:) delimits the host from the port number. Within the user info, a colon (:) delimits the username from the password. (Yes, I know the password portion is deprecated. It may still optionally be supported.)

This is the full spec for an Authority. Obviously, the user info and port number are often not present.

The Uri class in .NET drops the user information when returning the Authority which is rather annoying because it's not correct. Instead you can find the user info in the UserInfo property:

Uri.UserInfo

Other answers are technically correct to say that for the .NET Uri class that the difference between Uri.Authority and Uri.Host is that the host will not contain a port number.

But please know that Authority is not properly defined the way it is used in the .NET Uri class because it may also contain user info.