3

Web アプリケーションでは、認証に使用される AudienceURI があります。次のようなコードから設定すると:

var audience1 = new UriBuilder("dev.website.com")
                 {
                    Port = 443,
                    Scheme = "https",
                    Path = "/"
                 }.Uri; // Does not work!

ワーキングではありません。

しかし、私がこのように設定すると:

var audenice2 = new Uri("https://dev.website.com"); // It works!

それは正常に動作します。

面白いのは、以下が正常に動作していることです!!

var audience3 = new Uri(audience1.ToString());  // It works!

違いは何ですか?

4

1 に答える 1

2

(UriBuilderビルダー パターンの他の実装と同様に) を使用すると、より大きなオブジェクトを「断片的な」方法で組み立てるのに必要なピースを提供し、(.Uriプロパティを使用して) 最終製品のインスタンスを生成できます。一度にオブジェクトをビルドする必要は必ずしもありません (つまり、ビルダーを変更することができます)。

ただし、UriBuilder(String)コンストラクタを正しく使用していないようです。MSDN から

このコンストラクターは、uri で指定されたように設定された Fragment、Host、Path、Port、Query、Scheme、および Uri プロパティを使用して、UriBuilder クラスの新しいインスタンスを初期化します。

このコンストラクターのオーバーロードを使用するには、これを行う必要があることを意味します。

 var audience1 = new UriBuilder("https://dev.website.com").Uri;

(またはhttps://dev.website.com:443)

Uri同じ文字列で直接構築するよりも利点がないため、これは役に立ちません。

より一般的には、次のUriBuilderように Uri を少しずつ組み立てるために使用されます。

var myUriBuilder = new UriBuilder();
myUriBuilder.Host = (host == "dev")
  ? "dev.website.com"
  : "qa.website.com";

 if (useSsl)
 {
     myUriBuilder.Scheme = "https";
     myUriBuilder.Port = 443;
 }

var myUri = myUriBuilder.Uri;

(つまり、ビルダーの各プロパティの運命を個別のステートメントで決定する、やや複雑なロジックを使用します)。

于 2015-05-25T18:20:16.540 に答える