C# MonoTouch中的Unescape System.Uri
在开发我最初的MonoTouch iOS应用程序时我试图使用System.Uri实例从私有web服务下载受保护的资源,但由于所有实例总是返回未替换的URL,因此在检查签名时,我的请求失败 良好请求的示例: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
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类的每一个测试(您使用的类不是为它设计的,也不是经过测试的),而且实现可能会随时更改