2010-08-19 70 views
4

我最近已經意識到,使用URL和URI的.NET apis經常在實現甚至基本功能(至少很容易)方面出現短缺,包括如下內容:生成來自相對路徑的FQDN網址,強制https或返回http,獲取網站的根,合適地組合相關的網址等等。.NET的替代品提供了關於uris和url的apis

是否有任何替代庫已將所有這些類型的功能放在一個簡單可靠的項目中?

回答

4

趙旭日是一個很好的類,它是開源項目的一部分,由MindTouch的

http://developer.mindtouch.com/en/ref/dream/MindTouch.Dream/XUri?highlight=XUri

這篇文章包含有關如何使用它的快速樣品。

http://blog.developer.mindtouch.com/2009/05/18/consuming-rest-services-and-tdd-with-plug/

我很喜歡它。如果你打算只使用XUri部分,那麼稍微矯枉過正,但是圖書館還有其他非常好的東西。

+0

這看起來有很多潛力,我認爲必須有一個類似這樣的庫。 – 2010-08-28 16:18:18

+0

再次嘆息吃我的賞金。對不起,我無法將它分配給你。我不明白他們爲什麼會立即自動分配,爲什麼不在等待幾天之後(或在這種情況下幾個小時),讓用戶能夠在整整7天后分配它,而不必切斷它簡短。 – 2010-08-30 15:25:28

+0

沒有汗水。很高興你覺得它很有用。 – 2010-08-30 21:34:19

11

我確實發現自己在.NET中多次使用相同的URI操作代碼,但我沒有看到您的案例是它缺乏的地方。

完整的URI從相對URI:

new Uri(base, relative) // (works whether relative is a string or a Uri). 

獲得實際的FQDN:

string host = uri.Host; 
string fqdn = hostEndsWith(".") ? host : host + "."; 

強制HTTPS或返回到http:

UriBuilder toHttp = new UriBuilder(someUri); 
toHttp.Scheme = "http"; 
toHttp.Port = 80; 
return toHttp.Uri; 

UriBuilder toHttps = new UriBuilder(someUri); 
toHttps.Scheme = "https"; 
toHttps.Port = 443; 
return toHttps.Uri; 

獲取站點的根目錄:

new Uri(startingUri, "/"); 

結合相對URL正確:

new Uri(baseUri, relUri); // We had this one already. 

只有兩個的這些比單個方法調用多,而那些獲得FQDN的是相當模糊的(除非而不是要你只想要點結束FQDN絕對的URI,在這種情況下我們可以回到單一的方法調用)。

HTTPS/HTTP切換有單一方法版本,但它實際上更麻煩,因爲它調用了Uri對象的多個屬性。我可以接受幾行來做這個開關。

儘管如此,提供了新的API,一個只需要電源:

public static Uri SetHttpPrivacy(this Uri uri, bool privacy) 
{ 
    UriBuilder ub = new UriBuilder(uri); 
    if(privacy) 
    { 
     ub.Scheme = "https"; 
     ub.Port = 443; 
    } 
    else 
    { 
     ub.Scheme = "http"; 
     ub.Port = 80; 
    } 
    return ub.Uri; 
} 

我實在看不出的API也可能會被任何在其他情況下,更簡潔。

+0

+1對於http與https,不要忘記在UriBuilder上設置端口,否則它會保留錯誤的端口,否則就是443而不是80。 – eglasius 2010-08-26 17:35:41

+0

@eglasius你就是,我編輯過。當然,嚴格來說,原來是按照要求做的事情(如果你願意,你可以在端口80上提供HTTPS,在端口443上提供HTTP),但是現在我已經做了什麼,通常會被要求。 – 2010-08-26 20:05:10

+0

您做了複製/粘貼錯誤,您將端口443分配給'scheme'。 – 2010-08-26 21:38:51

2

我還使用擴展名與'System.IO.Path'對象的組合。

這些只是一個例子。

public static Uri SecureIfRemote(this Uri uri){ 



if(!System.Web.HttpContext.Current.Request.IsSecureConnection && 
       !System.Web.HttpContext.Current.Request.IsLocal){ 
return new Uri......(build secure uri here) 
} 

return uri; 

    } 

public static NameValueCollection ParseQueryString(Uri uri){ 
return uri.Query.ParseQueryString(); 
} 


    public static NameValueCollection ParseQueryString(this string s) 
    { 
     //return 
     return HttpUtility.ParseQueryString(s); 
    }