2011-05-26 73 views
19

所以我有这个Uri对象,其中包含一个地址,如http://localhost:1000/blah/blah/blah。我需要更改端口号并保持地址的所有其他部分不变。假设我需要它是http://localhost:1080/blah/blah/blah改变System.Uri的端口

Uri对象几乎是不可变的,所以我可以通过Port属性访问端口号,但它是只读的。有没有什么理智的方法可以创建一个完全像另一个但具有不同端口的物体Uri?对于“理智”,我的意思是“没有搞乱正则表达式和字符串操作”,因为虽然对于上面的例子来说它是微不足道的,但它仍然闻起来像是一堆蠕虫。如果这是唯一的方法,我真的希望它已经由某人实施,并且可能有一些帮手(我没有找到任何)

在此先感谢。

回答

42

你考虑过UriBuilder类吗?

http://msdn.microsoft.com/en-us/library/system.uribuilder.aspx

的UriBuilder类提供了一个方便的方法来修改Uri实例的内容,无需为每个修改创建一个新的Uri实例。

UriBuilder属性提供对只读Uri属性的读/写访问权限,以便修改它们。

+9

有一点要注意有关'UriBuilder'是,如果你设置了'Port'到** -1 **它使用协议的默认值,如果您不想要端口#的输出,那么它非常有用。 – 2012-08-14 14:42:24

+0

@PaulTyng感谢那宝藏!这正是我所期待的。 (与UriBuilder类一起) – 2013-10-04 16:22:43

+0

虽然计划是什么?它做什么,我应该放在那里? – Cullub 2014-09-09 12:31:15

37

我第二次投票UriBuilder。但事实上我对改变URI的端口扩展方法:

public static class UriExtensions { 
    public static Uri SetPort(this Uri uri, int newPort) { 
     var builder = new UriBuilder(uri); 
     builder.Port = newPort; 
     return builder.Uri; 
    } 
} 

用法:

var uri = new Uri("http://localhost:1000/blah/blah/blah"); 
uri = uri.SetPort(1337); // http://localhost:1337/blah/blah/blah 
+0

谢谢,UriBuilder很棒,我喜欢这种扩展方法,所以+1。要标记jglouie的答案,虽然看到他是第一个 – Dyppl 2011-05-26 11:42:40

+0

在我看来,在这里使用扩展名并不好。提供一个SetPort方法,用户不需要获取返回的Uri。对我来说,只有这样才能使用它:uri.SetPort(1337); – duedl0r 2017-09-11 00:22:47