Uri.Host和Uri.Authority有什么区别


82

System.UriHostAuthorityDnsSafeHost。MS在此处提供了何时HostDnsSafeHost与众不同的一个很好的示例。

我想了一个类似的例子/解释HostAuthority

Answers:


103

是的,从外行的角度来说,布兰登是绝对正确的

权限=主机名+端口号

并且如果URL协议使用默认端口,例如HTTP URL为端口80,则仅在那种情况下Authority =主机名(端口号假定为80),

主机名是域名或IP地址

例:

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

    权限= www.example.com
    主机名= www.example.com

  2. http://255.255.255.255:8080/

    权限= 255.255.255.255:8080
    主机名= 255.255.255.255


1
一个小疑问。如果我在本地主机上运行该应用程序,则我的URL中有端口号,但是在生产环境中,我的URL中没有端口号。因此,我可以自由使用Url.Authority对吗?我的意思是,如果端口号不存在,那么URl.Authority将与URL.Host权限相同。我的意思是说我仍然可以正确获得该网址吗?请指导我。
牢不可破

阅读stackoverflow.com/a/39415643/316343,它错过了User Information一部分。
Jahan

35

从MSDN URI.Host页面。

与Authority属性不同,此属性值不包括端口号。


一个小疑问。如果我在本地主机上运行该应用程序,则我的URL中有端口号,但是在生产环境中,我的URL中没有端口号。因此,我可以自由使用Url.Authority对吗?我的意思是,如果端口号不存在,那么URl.Authority将与URL.Host权限相同。我的意思是说我仍然可以正确获得该网址吗?请指导我。
牢不可破

@Unbreakable-是的,这对两种情况都适用。如果您未在url中指定端口号,则只需使用默认端口号,在这种情况下,Url.Authority将忽略该端口。
BornToCode

15

每个HTTP URL都符合通用URI的语法。URI通用语法包含五个组成部分的层次结构序列:

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

其中授权组件分为三个子组件:

authority = [userinfo@]host[:port]

像这样:

维基

可选的授权组件,其前面带有两个斜杠(//),包括:

  • 可选的userinfo子组件,可以由用户名和可选的密码组成,后跟冒号(:),后跟at符号(@)。出于安全原因,不建议在userinfo子组件中使用用户名:密码格式。应用程序不应在userinfo子组件中第一个冒号(:)之后的任何数据均以明文形式呈现,除非冒号之后的数据为空字符串(表示无密码)。
  • 可选的主机子组件,由注册名称(包括但不限于主机名)或IP地址组成。IPv4地址必须采用点分十进制格式,并且IPv6地址必须括在方括号([])中。
  • 可选端口子组件,其前面带有冒号(:)。

有关更多详细信息,您可以参考https://en.wikipedia.org/wiki/URL


12

对于.NET中的Uri类,授权包括端口,主机不包括端口,并且都不包括用户信息。

有效URI的一些示例:

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

根据RFC3986第3.2节管理局含有

  1. 用户信息
  2. 主办
  3. 端口号。

不只是主机和端口号。

例如,以下是有效的URI:

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

管理局所在的地方

user:password@host:80

符号(@)分隔主机中的用户信息,冒号(:)分隔端口号中的主机。在用户信息中,用冒号(:)分隔用户名和密码。(是的,我知道密码部分已被弃用。仍然可以选择支持它。)

这是授权机构的完整规格。显然,用户信息和端口号通常不存在。

.NET中Uri类在返回授权时会丢弃用户信息,这很烦人,因为它不正确。相反,您可以在UserInfo属性中找到用户信息:

Uri.UserInfo

其他答案在技术上是正确的,对于.NET Uri类来说,,Uri.Authority和Uri.Host之间的区别在于主机将不包含端口号。

但是请注意,在.NET Uri类中未正确定义Authority的使用方式,因为它可能还包含用户信息。


10

根据您链接到的文档,如果该Authority属性与Uri的默认端口不同,则该属性将包括端口号,而Host属性属性仅返回DNS主机名或IP地址。

我认为没有比这更多的区别了。


1
一个小疑问。如果我在本地主机上运行该应用程序,则我的URL中有端口号,但是在生产环境中,我的URL中没有端口号。因此,我可以自由使用Url.Authority对吗?我的意思是,如果端口号不存在,那么URl.Authority将与URL.Host权限相同。我的意思是说我仍然可以正确获得该网址吗?请指导我。
牢不可破

0

授权还可以包括用户名和密码,例如

bob:pwd@somewhere.example.com

更常用于FTP URI


对不起,你错了。从RFC 3986第3.2节中获得授权“ authority = [userinfo“ @”] host [“:” port]“
Adrien

RFC中已弃用带有普通密码的用户信息,但仍经常使用,尤其是对于FTP URI,并且IE仍支持此信息(实际上,这是通过IE通过http代理通过FTP进行身份验证的唯一方法)。
阿德里安

4
问题是关于System.URI.Authority,它与RFC 3986不同。–
Brian Brian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.