我最近意识到使用URL和URI的.NET apis在实现甚至基本功能(至少容易)方面经常出现短缺,包括:从相对路径生成FQDN URL,强制https或者回到http,获取网站的根目录,正确组合相对网址等等。
是否有任何替代库可以将所有这些类型的功能放在一个简单可靠的项目中?
答案 0 :(得分: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, "/");
正确组合相对网址:
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如何更简洁。
答案 1 :(得分:4)
XUri是一个很好的类,它是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部分,那就有点矫枉过正了,但是库里还有其他很好的东西。
答案 2 :(得分: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);
}