你如何正确编码包含哈希(#)的路径?请注意,散列不是片段(书签?)指示符,而是路径名称的一部分.
例如,如果有这样的路径:
http://www.contoso.com/code/c#/somecode.cs
例如,尝试执行此操作时会导致问题:
Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs");
Run Code Online (Sandbox Code Playgroud)
它似乎将哈希解释为片段指示符.
用%23手动替换#感觉不对.是否还有其他角色需要更换?在Uri和HttpUtility中有一些转义方法,但似乎都没有.
你不应该使用几个字符.您可以尝试通过这个非常干燥的文档来工作,或者在Stack Overflow上参考这个方便的URL摘要.
如果您查看这个网站,您会看到他们的C#问题已编码%23.
您可以使用(对于ASP.NET)执行此操作:
string.Format("http://www.contoso.com/code/{0}/somecode.cs",
Server.UrlEncode("c#")
);
Run Code Online (Sandbox Code Playgroud)
或者对于类库/桌面:
string.Format("http://www.contoso.com/code/{0}/somecode.cs",
HttpUtility.UrlEncode("c#")
);
Run Code Online (Sandbox Code Playgroud)
多挖了一些朋友,发现了一个关于Java的重复问题:Java中的 HTTP URL地址编码
然而,.Net Uri类没有提供我们需要的构造函数,但是UriBuilder提供了。
因此,为了构建路径包含非法字符的正确 URI,请执行以下操作:
// Build Uri by explicitly specifying the constituent parts. This way, the hash is not confused with fragment identifier
UriBuilder uriBuilder = new UriBuilder("http", "www.contoso.com", 80, "/code/c#/somecode.cs");
Debug.WriteLine(uriBuilder.Uri);
// This outputs: http://www.contoso.com/code/c%23/somecode.cs
Run Code Online (Sandbox Code Playgroud)
通知如何它并没有不必要地逃脱URI的部件不需要逸出(如://部分),这是与HttpUtility.UrlEncode的情况。看起来这个类的目的实际上是对 URL 的查询字符串/片段部分进行编码 - 而不是方案或主机名。
| 归档时间: |
|
| 查看次数: |
11570 次 |
| 最近记录: |