关于uri和url,.NET提供的api有哪些替代品?

4
我最近意识到,与URL和URI相关的.NET API在实现基本功能(至少是容易实现的)方面经常不够完善,包括:从相对路径生成FQDN URL,强制使用https或返回http,获取站点的根目录,正确组合相对URL等等。
是否有任何替代库已将所有这些类型的功能放入简单可靠的项目中?
3个回答

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在其他情况下可能会更简洁。


+1 for http vs. https,别忘了在UriBuilder上设置端口,否则会保留错误的端口,例如443而不是80用于http。 - eglasius
@eglasius,你说得对,我已经编辑过了。当然,严格来说,原始版本是根据要求进行操作的(毕竟,如果你愿意,可以在端口80上提供HTTPS,在端口443上提供HTTP),但现在我所拥有的内容符合一般需求。 - Jon Hanna
你犯了一个复制/粘贴的错误,你把端口443分配给了“scheme”。 - Daniel Beck
@Daniel。哈哈,问题是因为我没有复制粘贴。还有大小写错误。谢谢。 - Jon Hanna
谢谢。我自己需要花费更多的精力来通过HttpRequest解析查询字符串(虽然不同但相关,而且Uri中也没有理由不包含它)。如果你想区分?a=1&a=2和?a=1,2,那么它就非常糟糕了,而且完全没有支持分号作为分隔符的功能,这意味着你必须为此构建自己的解析对象。即使确保边缘情况得到捕捉,这仍然不到一个小时的工作量。 - Jon Hanna

4

这看起来有很大的潜力,我想肯定有类似于这样的库。 - Chris Marisic
叹息,SO再次吃掉了我的赏金。很抱歉我不能分配给你。我不明白为什么他们会立即自动分配它,为什么不等待一段时间(或在这种情况下几个小时)让用户在完整的7天后分配它,而不是缩短时间。 - Chris Marisic
没问题。很高兴你觉得它有用。 - Brad Cunningham
这个库还存在吗?上面的链接似乎默认跳转到MindTouch的主页。谷歌搜索也没有结果。 - warriorpostman
很遗憾,我不相信它还存在。我认为所有的开源东西都变成了闭源 :( - Brad Cunningham

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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接