2010-01-27 51 views
6

下面这行代码给出了一个例外。这是框架中的错误吗?如果不是我能采取什么方法呢?为什么Uri中的冒号“:”传递给Uri.MakeRelativeUri会导致异常?

这似乎是“:”(冒号)引起的问题,然而,我看到这样的URI的工作就ok生产网站(即似乎是一个有效的URI在现实世界中)

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xx:yy")); 
// gives => System.UriFormatException: A relative URI cannot be created because the 
// 'uriString' parameter represents an absolute URI 

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xxyy")); 
// this works - removed the colon between the xx and yy 

PS。具体来说,我可以问,鉴于上述情况,我可以使用哪些.NET类/方法(注意我正在解析网页中的HTML页面)以获取(a)页面URI和(b)HTML中的相对字符串HREF参数[例如在这种情况下会是“/ xx:yy”)并返回可用于解决该资源的有效URI?

换句话说,我该如何模仿浏览器的行为,以便翻译HREF和页面URI,以生成单击它时用于转到该资源的URI。

+1

乔恩波斯特尔:“你接受自由,保守你发送的东西。请引用RFC及其段落号,证明这是一个有效的URI。 – 2010-01-27 01:13:35

回答

5

我认为它是一个错误。

RFC1738说,:(其中包括其他字符)可能被保留为一个计划内的特殊含义。然而,http计划不会在通路部分中

Within the <path> and <searchpart> components, "/", ";", "?" are reserved. 

保留它(不:

hsegment  = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 

所以,http://test.com/xx:yy是一个有效的URI。较新的RFC3968同意:

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 

但是当然,relativised对http://test.com/asdf以后,将所得xx:yy将是一个绝对URI,而不是一个有效的相对URI:

path-noscheme = segment-nz-nc *("/" segment) 
segment-nz-nc = 1*(unreserved/pct-encoded/sub-delims/"@") 
       ; non-zero-length segment without any colon ":" 

所以MakeRelativeUri是一种权利报告有一个问题,但它真的应该通过编码在绝对URI中有效的:到在相对URI的第一段中有效的%3A来自动修复它。

我通常会尽量避免使用MakeRelativeUri来支持根相对URI,这些URI更易于提取并且不存在此问题(/xx:yy正常)。

+0

感谢bobince多数民众赞成伟大 - 你知道一个直接.net方法,该方法根据PageURI + HRefString给出根相对URI?只是在寻找一个目前...或者你必须“自己动手”吗? – Greg 2010-01-27 01:59:58

+0

实际上,我应该为此启动一个新问题并将此标记为完成...我将执行此操作 – Greg 2010-01-27 02:10:05

+0

在http://stackoverflow.com/questions/2144150/c-question-how-do中创建了此特定问题-i-convert-a-pageuri -href-to-an-absolute-url-uri – Greg 2010-01-27 02:17:30

1

冒号在URL中扮演着特殊的角色 - 例如表示一个端口,因此是'保留'(see here)。

URL在定义语法时使用某些字符作为特殊的 。当 这些字符不是在URL中的 特殊的作用时,他们需要 进行编码

所以,结肠应该逃脱。

+0

谢谢谢恩 - 我已经提出了更具体的问题什么会帮助我 – Greg 2010-01-27 01:34:27

0

如果找到冒号,它会尝试解析冒号后面的值作为端口号,如果您没有提供有效的端口号,它将会失败。有关类似问题的示例请参阅here,请参阅MSDN link for UriFormatException details

+0

感谢坦纳 - 我已经提出了更具体的问题什么会帮助我 – Greg 2010-01-27 01:35:05

相关问题