如何编码包含哈希的路径?

Dod*_*bit 18 c# url uri

你如何正确编码包含哈希(#)路径?请注意,散列不是片段(书签?)指示符,而是路径名称的一部分.

例如,如果有这样的路径:

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中有一些转义方法,但似乎都没有.

Fen*_*ton 7

你不应该使用几个字符.您可以尝试通过这个非常干燥的文档工作,或者在Stack Overflow上参考这个方便的URL摘要.

如果您查看这个网站,您会看到他们的C#问题已编码%23.

Stack Overflow C#问题

您可以使用(对于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)


Dod*_*bit 6

多挖了一些朋友,发现了一个关于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 的查询字符串/片段部分进行编码 - 而不是方案或主机名。