Unescape System.Uri MonoTouch

时间:2012-11-16 01:16:16

标签: c# xamarin.ios uri

在开发我的初始 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?

我需要进行此转换,否则我将被迫在我的私人网络服务上公开我的资源。

我还测试了一些替代方案:

  1. 来自其他问题:GETting a URL with an url-encoded slash,但有些例外情况正在发生:

    System.NullReferenceException:未将对象引用设置为对象的实例

  2. 使用配置文件,但在这种情况下,由于移动设备在技术上没有应用程序域,因此它们不可用。

  3. 通过用百分号替换百分号来对URL进行双重编码 编码百分号(所以'%'变为'%25')。

  4. 我的尝试都没有解决我的问题。

    提前致谢,

    和Piva

1 个答案:

答案 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类的每一个测试(你以不是为它设计,也没有经过测试的方式使用这个类),而且实现可能随时都会改变。