【问题标题】:What's the difference between new Uri(..) and new UriBuilder(..).Uri for the same host?同一主机的 new Uri(..) 和 new UriBuilder(..).Uri 有什么区别?
【发布时间】:2015-08-07 06:14:08
【问题描述】:

在 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!

知道有什么区别吗?

【问题讨论】:

    标签: .net uri wif uribuilder


    【解决方案1】:

    UriBuilder(与构建器模式的任何实现一样)允许您以“零碎”的方式提供组装较大对象所需的部分,然后允许您生成最终产品的实例(使用 @ 987654323@财产)。您不一定需要一次性构建对象(即,您可以随时更改构建器)。

    但是,您似乎没有正确使用 UriBuilder(String) 构造函数。 From 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;
    

    (即在单独的语句中确定每个构建器属性的命运的逻辑有些复杂)。

    【讨论】:

    • 其实没用。如果我将端口更改为-1,它可以正常工作!
    • 您能解释一下您所说的“不起作用”是什么意思吗?所有技术(直接UriUriBuilder,以及零碎的UriBuilder)都可以用来构建相同的Uri?将端口设置为 -1 会根据方案将 Uri 重置为其默认端口(例如,HTTP 为 80,HTTPS 为 443)
    猜你喜欢
    • 2018-08-02
    • 2011-11-22
    • 1970-01-01
    • 2018-06-04
    • 2012-12-29
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多