在.NET中创建Uri会自动对来自传递字符串的所有参数进行编码

Eug*_*ica 8 .net c# url escaping

假设我想从以下字符串创建一个Uri对象:

string url = @"http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com";
Uri uri = new Uri(url, UriKind.Absolute);
Run Code Online (Sandbox Code Playgroud)

预期结果将是:

http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 
Run Code Online (Sandbox Code Playgroud)

获得:

http://someserver.com/?param1=1&url=http://www.otherserver.com
Run Code Online (Sandbox Code Playgroud)

在允许创建Uri的许多相关方法中注意到相同的行为:Uri.TryCreate,UriBuilder.Uri等.

如何获得保留初始编码参数的Uri?

Pen*_*hev 6

在.NET4中,您可以通过配置禁用某些方案的Uri压缩:

<configuration>
  <uri>
    <schemeSettings>
      <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/>
    </schemeSettings>
  </uri>
</configuration>
Run Code Online (Sandbox Code Playgroud)

请注意,与禁用默认行为有关的安全隐患.


Cod*_*ter 5

您是如何“获取”URL 的?如果我在 Visual Studio 中将鼠标悬停在它上面,它确实会显示解码后的 URL。

但每当我通过该AbsoluteUri属性访问它时,它都会显示编码的 URL。


Jon*_*Jon 3

此行为有记录

作为某些方案的构造函数中规范化的一部分,转义表示被压缩。URI 将压缩转义序列的方案包括:file、http、https、net.pipe 和 net.tcp。对于所有其他方案,转义序列不会被压缩。例如:如果您将两个点“..”百分比编码为“%2E%2E”,则 URI 构造函数将针对某些方案压缩此序列。例如,以下代码示例显示了 http 方案的 URI 构造函数。

因此,一种解决方法可能是暂时使用自定义方案(例如leavemealone://)来构造 URL 对象(可能通过UriBuilder?)。