2011-05-26 61 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