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


86

System.Uri持っているHostAuthorityDnsSafeHost。MSは、ここでいつHostDnsSafeHostが異なるかについての良い例を提供します

私はのための同様の例/説明が欲しいHostAuthority

回答:


105

はいブランドンは素人の言葉で絶対に正しいです

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

また、URLプロトコルがデフォルトのポート(http URLにポート80など)を使用している場合は、その場合にのみ、権限=ホスト名(ポート番号は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
1つの小さな疑問。ローカルホストでアプリケーションを実行する場合、URLにポート番号がありますが、本番環境ではURLにポート番号がありません。だから、私はUrl.Authorityを自由に使うことができますよね?つまり、ポート番号がない場合、URl.AuthorityはURL.Hostの権利と同じように機能します。私はまだURLを正しく取得できるという意味ですか?案内してください、。
アンブレイカブル2016

stackoverflow.com/a/39415643/316343を読んでください、それはUser Information部分を逃しました。
Jahan

この回答のドキュメントリファレンスはありますか?何か権威がありますか?
ジョナサン

35

MSDNから MSDNURI.Hostページ。

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


1つの小さな疑問。ローカルホストでアプリケーションを実行する場合、URLにポート番号がありますが、本番環境ではURLにポート番号がありません。だから、私はUrl.Authorityを自由に使うことができますよね?つまり、ポート番号がない場合、URl.AuthorityはURL.Hostの権利と同じように機能します。私はまだURLを正しく取得できるという意味ですか?案内してください。
アンブレイカブル2016

@ Unbreakable-そうです、どちらの場合でも機能します。URLにポート番号を指定しない場合は、デフォルトのポート番号を使用するだけです。その場合、Url.Authorityはポートを省略します。
BornToCode 2018年

17

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

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

ここで、権限コンポーネントは3つのサブコンポーネントに分割されます。

authority = [userinfo@]host[:port]

このような:

ウィキ

2つのスラッシュ(//)が前に付いたオプションの権限コンポーネント。

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

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


12

.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

アットマーク(@)はホストからのユーザー情報を区切り、コロン(:)はホストをポート番号から区切ります。ユーザー情報内では、コロン(:)でユーザー名とパスワードを区切ります。(はい、パスワード部分が非推奨になっていることは知っています。オプションでサポートされる可能性があります。)

これは、機関の完全な仕様です。明らかに、ユーザー情報とポート番号はしばしば存在しません。

.NETUriクラスは、Authorityを返すときにユーザー情報をドロップしますが、これは正しくないため、かなり面倒です。代わりに、UserInfoプロパティでユーザー情報を見つけることができます。

Uri.UserInfo

他の答えは技術的に正しいと言って、.NET Uriクラスの場合、Uri.AuthorityとUri.Hostの違いは、ホストにポート番号が含まれないことです。

ただし、Authorityにはユーザー情報も含まれている可能性があるため、.NETUriクラスでの使用方法が適切に定義されていないことに注意してください。


10

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

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


1
1つの小さな疑問。ローカルホストでアプリケーションを実行する場合、URLにポート番号がありますが、本番環境ではURLにポート番号がありません。だから、私はUrl.Authorityを自由に使うことができますよね?つまり、ポート番号がない場合、URl.AuthorityはURL.Hostの権利と同じように機能します。私はまだURLを正しく取得できるという意味ですか?案内してください。
アンブレイカブル2016

0

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

bob:pwd@somewhere.example.com

FTPURIでより一般的に使用されます


すみません、あなたは間違っています。RFC3986セクション3.2からAuthority "authority = [userinfo" @ "] host [": "port]"
Adrien

プレーンパスワードを使用したユーザー情報はRFCで非推奨になりましたが、特にFTP URIで一般的に使用されており、IEはこれをサポートしています(実際、httpプロキシを介してIE経由でFTPで認証する唯一の方法です)。
エイドリアン2016

4
質問は、RFC 3986と同じではありませんSystem.URI.Authority、についてです
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.