Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于URI和URL的.NET提供的API的替代方案_C#_.net_Url - Fatal编程技术网

C# 关于URI和URL的.NET提供的API的替代方案

C# 关于URI和URL的.NET提供的API的替代方案,c#,.net,url,C#,.net,Url,我最近意识到,使用url和URI的.NET API常常无法实现基本功能(至少很容易实现),包括:从相对路径生成FQDN url、强制https或返回http、获取站点根目录、正确组合相对url等等 有没有其他库可以将所有这些类型的功能放在一个简单可靠的项目中?我当然发现自己在.NET中不止一次地使用相同的URI操作代码,但我不认为您的案例是它所缺少的 来自相对URI的完整URI: new Uri(base, relative) // (works whether relative is a st

我最近意识到,使用url和URI的.NET API常常无法实现基本功能(至少很容易实现),包括:从相对路径生成FQDN url、强制https或返回http、获取站点根目录、正确组合相对url等等


有没有其他库可以将所有这些类型的功能放在一个简单可靠的项目中?

我当然发现自己在.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怎么可能更简洁。

我还将扩展与'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);
    }

XUri是一个不错的类,它是MindTouch开源项目的一部分

本文包括一个关于如何使用它的快速示例


我是它的粉丝。如果你只想使用XUri部分,在汇编方面有点过分,但是库中还有其他非常好的东西。

+1对于http和https,不要忘记在UriBuilder上设置端口,否则它会保留错误的端口,即443而不是http的80。@eglasius没错,我已经编辑过了。当然,严格地说,最初的版本是符合要求的(如果您愿意的话,您可以在端口80上提供HTTPS,在端口443上提供HTTP),但我现在拥有的是通常需要的。您犯了一个复制/粘贴错误,您将端口443分配给
scheme
@Daniel。哈哈,问题是因为我没有复制粘贴。这也是错误的外壳。谢谢,谢谢。我自己不得不花更多的精力通过HttpRequest进行查询字符串解析(不同但相关,没有理由不在Uri中)。如果你想把?a=1&a=2和?a=1,2区分开来,它就被破坏了,而且完全不支持分号作为分隔符,这意味着你必须为此构建自己的解析对象。这仍然不到一个小时的工作,即使确保边缘案件被抓获。这看起来有很大的潜力,我想必须有一个类似的图书馆。再次叹息,所以吃我的赏金。对不起,我不能分配给你。我不明白为什么他们会立即自动分配它,为什么不在时间段后几天(或者在本例中是几小时)等待用户能够在整整7天之后分配它,而不必缩短时间。不用担心。很高兴你发现它有用。这个图书馆还存在吗?上面的链接似乎默认为MindTouch的主页。谷歌搜索被证明是徒劳的。我不相信它存在了。我认为开源的东西都是开源的:(