在开发我的初始 MonoTouch iOS应用程序时,我尝试使用System.Uri实例从私有Web服务下载受保护资源,但由于所有实例始终返回未转义的URL,因此我的请求失败检查他们的签名。
良好请求的示例:
http://example.com/folder%2Ftest?signature=000%3D
错误请求的示例:
http://example.com/folder/test?signature=000=
为了正确下载我的资源,我需要将一个好的URL从一个简单的字符串转换为一个好的Uri实例。我刚开始这个过程,但我无法得出结论:
string urlStringVersion = "http://example.com/folder%2Ftest?signature=000%3D";
//
// urlStringVersion == http://example.com/folder%2Ftest?signature=000%3D
Uri urlUriVersion = new Uri (urlStringVersion);
//
// urlUriVersion == http://example.com/folder/test?signature=000=
var fi = typeof (Uri).GetField ("host", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue (urlUriVersion, "example.com");
//
// urlUriVersion.AbsoluteUri is now == http://example.com/folder/test?signature=000%3D
<Another C# command here>
//
// urlUriVersion.AbsoluteUri is now == http://example.com/folder%2Ftest?signature=000%3D
最后,我可以使用哪个命令来替换另一个C#命令,以便让我的最终 urlUriVersion.AbsoluteUri 指向相同的初始 urlStringVersion 描述了URL?
我需要进行此转换,否则我将被迫在我的私人网络服务上公开我的资源。
我还测试了一些替代方案:
来自其他问题:GETting a URL with an url-encoded slash,但有些例外情况正在发生:
System.NullReferenceException:未将对象引用设置为对象的实例
使用配置文件,但在这种情况下,由于移动设备在技术上没有应用程序域,因此它们不可用。
通过用百分号替换百分号来对URL进行双重编码 编码百分号(所以'%'变为'%25')。
我的尝试都没有解决我的问题。
提前致谢,
和Piva
答案 0 :(得分:1)
您正在使用的Uri constructor使用未转义的网址字符串,而不是转义的网址字符串。
在创建Uri实例之前尝试unescaping url字符串:
string urlStringVersion = "http://example.com/folder%2Ftest?signature=000%3D";
urlStringVersion = Uri.UnescapeDataString (urlStringVersion);
Uri urlUriVersion = new Uri (urlStringVersion);
如果要将Uri转换为(非)转义字符串,请使用GetComponents方法:
var unescaped = urlUriVersion.GetComponents (UriComponents.HttpRequestUri, UriFormat.Unescaped);
var escaped = urlUriVersion.GetComponents (UriComponents.HttpRequestUri, UriFormat.UriEscaped);
不要更改私人字段的值,这一天必然会破坏您的应用。你正在绕过Uri类的每一个测试(你以不是为它设计,也没有经过测试的方式使用这个类),而且实现可能随时都会改变。