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

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

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

预期结果将是:

 http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 

获得:

 http://someserver.com/?param1=1&url=http://www.otherserver.com 

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

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

记录此行为:

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

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

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

        

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

你是如何“获得”这个url的? 如果我在Visual Studio中将鼠标hover在它上面,它确实会显示已解码的URL。

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

在我的例子中,我通过返回UriBuilder类的ToString()方法而不是使用相同类的Uri属性来解决它。