web-dev-qa-db-ja.com

Uri.HostとUri.Authorityの違いは何ですか

System.UriにはHostAuthority、およびDnsSafeHostがあります。 MSは、HostDnsSafeHostが異なる場合の素敵な例を提供します here

HostAuthorityについても同様の例/説明をお願いします。

72
Brian

はい、ブランドンは、素人の用語で、絶対に正しいです

権限=ホスト名+ポート番号

URLプロトコルがデフォルトポートを使用している場合、たとえばhttp URLにポート80を使用している場合、その場合のみAuthority = Host Name(ポート番号は80と想定)、

一方、ホスト名はドメイン名またはI.Pアドレスのいずれかです

例:

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

    Authority = www.example.com
    ホスト名= www.example.com

  2. http://255.255.255.255:8080/

    Authority =255.255.255.255:8080
    ホスト名= 255.255.255.255

86
Saurabh Mishra

MSDNから RI.Host ページ。

Authorityプロパティとは異なり、このプロパティ値にはポート番号は含まれません。

34
kervin

.NETのUriクラスの場合、Authorityにはポートが含まれますが、Hostには含まれず、ユーザー情報も含まれません。

有効な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.Hostは、ホストにポート番号が含まれないことです。

ただし、Authorityは.NET Uriクラスで使用される方法で適切に定義されていないことに注意してください。

11

リンクしたドキュメントによると、AuthorityプロパティはUriのデフォルトポートと同じでない場合、ポート番号を含みますが、HostプロパティはDNSホストのみを返します名前またはIPアドレス。

それ以上の違いはないと思います。

10
Brandon

すべてのHTTP URLは、汎用URIの構文に準拠しています。 URI汎用構文は、5つのコンポーネントの階層シーケンスで構成されています。

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

authorityコンポーネントは3つのサブコンポーネントに分割されます。

authority = [userinfo@]Host[:port]

このような:

url syntax

オプションのauthorityコンポーネントの前に2つのスラッシュ(//)があります。

  • オプションのuserinfoサブコンポーネント。コロン(:)の後にアットマーク(@)が続くユーザー名とオプションのパスワードで構成されます。 userinfoサブコンポーネントでのusername:password形式の使用は、セキュリティ上の理由から非推奨です。アプリケーションは、コロンの後のデータが空の文字列(パスワードがないことを示す)でない限り、userinfoサブコンポーネント内で最初のコロン(:)の後のデータをクリアテキストとしてレンダリングしないでください。
  • オプションのHostサブコンポーネント。登録名(ホスト名を含むがこれに限定されない)またはIPアドレスで構成されます。 IPv4アドレスはドット10進表記である必要があり、IPv6アドレスは括弧([])で囲む必要があります。
  • オプションのportサブコンポーネントの前にコロン(:)を付けます。

詳細については、 https://en.wikipedia.org/wiki/URL を参照してください。

5
Frank.Chang

権限には、ユーザー名とパスワードを含めることもできます。

bob:[email protected]

fTP URIにより一般的に使用されます

0
Adrien