C# WebRequest将URL转换为Xamarin编码(MonoTouch)
我正在使用HttpWebRequest类在Xamarin中开发一个基于API的应用程序。我必须向URL发送请求C# WebRequest将URL转换为Xamarin编码(MonoTouch),c#,xamarin,xamarin.ios,httpwebrequest,C#,Xamarin,Xamarin.ios,Httpwebrequest,我正在使用HttpWebRequest类在Xamarin中开发一个基于API的应用程序。我必须向URL发送请求 http://example.com/APIRequest/Request?Parts=33333|N|2014|ABCD 但当我在Fiddler中看到这个请求时,它会显示URL http://example.com/APIRequest/Request?Parts=33333%7CN%7C2014%7CABCD 现在的问题是服务器无法理解这个编码的URL及其返回的错误,这超出了我
http://example.com/APIRequest/Request?Parts=33333|N|2014|ABCD
但当我在Fiddler中看到这个请求时,它会显示URL
http://example.com/APIRequest/Request?Parts=33333%7CN%7C2014%7CABCD
现在的问题是服务器无法理解这个编码的URL及其返回的错误,这超出了我的控制范围
早在我使用的.NET2.0c#应用程序中
Uri url = new Uri(rawurl, true);
但第二个参数在Xamarin上可用的.NET4.0Monotouch中已被弃用,因此它的给定错误或根本不做任何事情
我尝试了所有可能的方法,比如UrlDecode、htmldecode、double decode,甚至Java UrlDecode,但都没有成功,总是在Fiddler中显示编码的URL
请建议如何克服这个问题,或者使用新Uri(url字符串,true)或旧函数的任何替代方法
更新:
在花了n个小时后,我可能找到了罪犯。问题是
当我使用“newURI(url,true)”时,它将包含|(pipe)的未替换url发送到WebRequest。创建但如果我删除“true”,它将发送编码url,这会产生结果,但不幸的是服务器无法理解,所以我得到了错误
Uri ourUri = new Uri(url, true);
myHttpWebResponse1 = (System.Net.HttpWebResponse)request.GetResponse();
但如果在URL中使用|(pipe),request.GetResponse()可能会停止工作而不引发任何异常,并且进程挂起
有什么可能的解决办法吗
下面给出了我的完整函数(用硬编码URL修改)
是的,这段代码在.NET 2.0 Windows应用程序中非常有效,但在Xamarin Mono-Touch应用程序中却不起作用。您连接的服务器似乎不支持国际化资源标识符(IRI) 从mono 3.10开始,IRI默认启用 您可以通过以下操作在客户端应用程序上禁用它:
FieldInfo iriParsingField = typeof (Uri).GetField ("s_IriParsing",
BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic);
if (iriParsingField != null)
iriParsingField.SetValue (null, false);
您还可以通过将环境变量MONO_URI_irisparsing设置为false来禁用IRI解析
FieldInfo iriParsingField = typeof (Uri).GetField ("s_IriParsing",
BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic);
if (iriParsingField != null)
iriParsingField.SetValue (null, false);