Uri.ToString()とUri.AbsoluteUriの違いは何ですか?


92

ちょうど今Azureの質問へのコメントとして、@ smarxは指摘しました

私は通常、blob.Uri.ToString()よりもblob.Uri.AbsoluteUriを実行する方が良いと思います。

これには理由がありますか?のドキュメントにUri.AbsoluteUriは、Uri.ToString()「絶対URIを取得する」、「指定されたインスタンスの正規の文字列表現を取得する」と記載されています。


1
ToStringはURIをより読みやすくしますが、そうする間、いくつかのケースでは面倒になる多くのURLEncoded文字をデコードします。動作は、.netフレームワークのランタイム間でも異なります。比較については、dhvik.blogspot.com / 2019/12 /…を参照してください。
ダン

回答:


103

例えば:

UriBuilder builder = new UriBuilder("http://somehost/somepath");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;

この場合、 Uri.ToString()人間が読めるURLを返します:http:// somehost / somepath?somekey = some + value

Uri.AbsoluteUri 一方、HttpUtility.UrlEncodeが返したエンコード済みフォームを返します。 http://somehost/somepath?somekey=some%2bvalue


35
ただし、「人間が読めるURL」(ToStringから返されたもの)はおそらく破損しており、望んでいるものはほとんどないことに注意してください:code.logos.com/blog/2010/08/uritostring_must_die.html。可能な限りToStringを呼び出さないようにします。
Bradley Grainger、2012年

1
ToStringが必要な場合があります。ここSOは良い例です(上記の私の回答を参照してください)。URLを「視覚化」したい。重要なのは(常にプログラミングにおいて)-注意して、何をしているのかを知っていることです。
Ofer Zelig

3
この例(およびcode.logos.com/blog/2010/08/uritostring_must_die.html)の例は、最新のものではないことに注意してください。これらの問題は.NET Framework 4.5で修正されました。ただし、ToString()は依然として、人間が読み取れる(視覚的な)URLの表現のみを目的としています。このURLをブラウザーにコピーしても、引き続き機能します。
arni 2016年

1
[ docs.microsoft.com/en-us/dotnet/api/…OriginialStringよりも使用するのが最善のようですToString()
karsnen

31

さらに、あなたUri親類である ならば、Uri AbsoluteUri失敗しToString()ないでしょう。

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string str1 = uri.ToString(); // "fuu/bar.xyz"
string str2 = uri.AbsoluteUri; // InvalidOperationException

5

誰もがそれuri.AbsoluteUriをより良いと思うようですが、相対パスで失敗するので、おそらく普遍的な方法は次のようになります:

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string notCorruptUri = Uri.EscapeUriString(uri.ToString());

5

正しいものを確認して使用してみませんか?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();

0

次の例では、Uriインスタンスの完全な内容をコンソールに書き込みます。示されている例では、

http://www.cartechnewz.com/catalog/shownew.htm?date=today

コンソールに書き込まれます。

Uri baseUri = new Uri("http://www.cartechnewz.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm?date=today");
Console.WriteLine(myUri.AbsoluteUri);

AbsoluteUriプロパティには、すべてのフラグメントとクエリ文字列を含む、Uriインスタンスに格納されているURI全体が含まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.