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与直接使用相同的字符串构造 a 没有任何好处。

更常见的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 回答