在.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属性来解决它。