C# MonoTouch中的Unescape System.Uri

C# MonoTouch中的Unescape System.Uri,c#,xamarin.ios,uri,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= 错误请求的示例: http://example.com/folder%2Ftest?signatu

在开发我最初的MonoTouch iOS应用程序时我试图使用System.Uri实例从私有web服务下载受保护的资源,但由于所有实例总是返回未替换的URL,因此在检查签名时,我的请求失败

良好请求的示例:

http://example.com/folder%2Ftest?signature=000%3D
http://example.com/folder/test?signature=000=
错误请求的示例:

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
string urlStringVersion=”http://example.com/folder%2Ftest?signature=000%3D";
//
//urlStringVersion==http://example.com/folder%2Ftest?signature=000%3D
Uri UrlVersion=新Uri(urlStringVersion);
//
//urlUriVersion==http://example.com/folder/test?signature=000=
var fi=typeof(Uri).GetField(“主机”,BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(urlUriVersion,“example.com”);
//
//urlUriVersion.AbsoluteUri现在为==http://example.com/folder/test?signature=000%3D
但也出现了一些例外情况:

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

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

  • 通过将百分号替换为 编码的百分号(因此“%”变为“%25”)

  • 我的尝试都没有解决我的问题

    提前感谢,

    Piva

    您正在使用的接收未转义的url字符串,而不是转义的url字符串

    在创建Uri实例之前,请尝试url字符串:

    string urlStringVersion=”http://example.com/folder%2Ftest?signature=000%3D";
    urlStringVersion=Uri.UnescapeDataString(urlStringVersion);
    Uri UrlVersion=新Uri(urlStringVersion);
    
    如果要将Uri转换为(未)转义字符串,请使用以下方法:

    var unescaped=urlUriVersion.GetComponents(UriComponents.HttpRequestUri,UriFormat.unescaped);
    var escape=urlUriVersion.GetComponents(UriComponents.HttpRequestUri,UriFormat.UriEscape);
    
    不要更改私有字段的值,总有一天会破坏你的应用程序。您正在规避Uri类的每一个测试(您使用的类不是为它设计的,也不是经过测试的),而且实现可能会随时更改