Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest将URL转换为Xamarin编码(MonoTouch)_C#_Xamarin_Xamarin.ios_Httpwebrequest - Fatal编程技术网

C# WebRequest将URL转换为Xamarin编码(MonoTouch)

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及其返回的错误,这超出了我

我正在使用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及其返回的错误,这超出了我的控制范围

早在我使用的.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);