Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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在不同的方案中表现不同?_C#_Uri_Url Encoding_Percent Encoding - Fatal编程技术网

C# 为什么Uri在不同的方案中表现不同?

C# 为什么Uri在不同的方案中表现不同?,c#,uri,url-encoding,percent-encoding,C#,Uri,Url Encoding,Percent Encoding,在用Uri类回答另一个问题时,我发现了一些对我来说似乎很奇怪的东西: 考虑以下两个URI: var u1 = new Uri("http://a.b:33/abc%2fdef/c?d=f"); var u2 = new Uri("foobar://a.b:33/abc%2fdef/c?d=f"); 他们只是在计划上有所不同。提供的标识符的所有其他元素都相同 那么,为什么在转储这些Uri实例的段属性时,会看到u1的以下输出: / abc/ def/ c 为什么不同方案的解析行为不同?对不同

在用Uri类回答另一个问题时,我发现了一些对我来说似乎很奇怪的东西:

考虑以下两个URI:

var u1 = new Uri("http://a.b:33/abc%2fdef/c?d=f");
var u2 = new Uri("foobar://a.b:33/abc%2fdef/c?d=f");
他们只是在计划上有所不同。提供的标识符的所有其他元素都相同

那么,为什么在转储这些Uri实例的
属性时,会看到
u1
的以下输出:

/ abc/ def/ c 为什么不同方案的解析行为不同?

对不同的URI方案使用不同的解析器。例如,对于http和https URI,它使用,而对于ftp URI,它使用,等等。具有未知方案的URI由。您可以使用注册新方案


回答得好+1.你能告诉我是什么要求使这些“专用”方案成为非通用方案吗?我的印象是,URI就是一个URI,人们可以合理地期望它们被同等对待。所有URI都符合,但并非所有方案都利用了所有特性,或者它们对URI语法施加了更多限制。NET框架中的东西在幕后相当丑陋;我建议你带上你最喜欢的反编译器,自己看看。谢谢。我在看第3.3节,它并没有从一个方面或另一个方面来讨论转义斜杠。Apache中的存在表明,他们希望可以考虑转义的斜杠。这对我来说意味着我看到了过于明智的逃避,Uri行为是不正确的,但也许我读错了符文。http/https URI方案的最新规范在中。(在撰写本文时,草案是稳定的,但尚未以RFC的形式发布。从技术上讲,这是当前的规范。)其次,你是对的<路径段中的代码>%2F不应解码为
/
。但是HttpStyleUriParser这样做的原因可能与Apache中的AllowEncodeDslash指令相同。总的来说,.NET Framework中似乎有多个版本的URI解析器(至少3个),并且这些解析器似乎支持不同URI方案的各种“怪癖”。如果您需要符合标准的URI解析器,您应该检查MSDN以获得提示,或者定制您自己的URI解析器。更新:显然,在App.config中有一个选项可以为http和https URI设置。 / abc%2fdef/ c
UriParser.Register(new HttpStyleParser(), "foobar", 33);