C# 如何对包含散列的路径进行编码?

C# 如何对包含散列的路径进行编码?,c#,url,uri,C#,Url,Uri,如何正确地对包含散列(#)的路径进行编码?注意散列不是片段(书签?)指示符,而是路径名的一部分 例如,如果存在如下路径: 例如,当您尝试执行以下操作时,会导致问题: Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs"); 它似乎将散列解释为片段指示符 手动将#替换为%23是错误的。是否还有其他字符需要替换? Uri和HttpUtility中有一些转义方法,但似乎没有一个能起作用。使用:System.Web.Http

如何正确地对包含散列(#)的路径进行编码?注意散列不是片段(书签?)指示符,而是路径名的一部分

例如,如果存在如下路径:

例如,当您尝试执行以下操作时,会导致问题:

Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs");
它似乎将散列解释为片段指示符

手动将#替换为%23是错误的。是否还有其他字符需要替换? Uri和HttpUtility中有一些转义方法,但似乎没有一个能起作用。

使用:
System.Web.HttpUtility.UrlEncode(string)


有几个字符是不应该使用的。您可以尝试,或参考此

如果你查看这个网站,你会看到他们的C#问题是经过编码的
%23

您可以使用以下两种方法之一(对于ASP.NET):

或对于类库/桌面:

string.Format("http://www.contoso.com/code/{0}/somecode.cs",
    HttpUtility.UrlEncode("c#")
);

对朋友进行了更多的挖掘,发现了一个重复的Java问题:

然而,.NetUri类没有提供我们需要的构造函数,但是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

请注意,它是如何不必要地转义URI中不需要转义的部分的(例如://part),HttpUtility.UrlEncode就是这样。此类的目的似乎实际上是编码URL的查询字符串/片段部分,而不是方案或主机名。

请注意,以这种方式编码整个URL(包括方案和路径)实际上会生成一个无效URI的字符串。它抛出无效的URI:如果您尝试从URI构造URI,则无法确定URI的格式。我认为这里没有抓住要点。这不仅仅是关于#字符,而是关于如何使用可能包含任何无效字符的有效路径构造任意URI。@Dodgyrabbit,因为我们不知道URL的哪些部分是动态的,我让OP来决定在何处使用该实用程序类。我不认为System.Web.HttpUtility.UrlEncode去掉了#符号,我只是尝试了它,但它仍然存在,这截断了服务器端的查询。@Ted结果是C%23-您是如何测试该值的?示例中的字符串enc,尽管已转义,不再是有效的URI。尝试Uri=newuri(enc),您将看到它抛出无效的Uri异常。但是找到了正确的解决方案。很有趣。我有点被MSDN文档搞糊涂了,它说编码一个URL字符串。UrlEncode方法可用于对整个URL进行编码,包括查询字符串值。(见附件)
string.Format("http://www.contoso.com/code/{0}/somecode.cs",
    HttpUtility.UrlEncode("c#")
);
// 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