WebRequest将URL转换为Xamarin中的编码(MonoTouch)

时间:2015-04-17 13:08:45

标签: c# xamarin xamarin.ios httpwebrequest

我正在使用HttpWebRequest类在Xamarin中开发基于API的应用程序。我必须向URL发送请求

http://example.com/APIRequest/Request?Parts=33333|N|2014|ABCD

但是当我在Fiddler中看到这个请求时,它会显示我的网址

http://example.com/APIRequest/Request?Parts=33333%7CN%7C2014%7CABCD

现在问题是服务器及其返回的错误无法理解这个编码的URL,这是我无法控制的。

早期的.NET2.0 C#应用程序我正在使用

Uri url = new Uri(rawurl, true);

但第二个参数已在Xamarin上提供的.NET 4.0 MonoTouch中弃用,因此它给出了错误或者根本没有做任何事情。

我尝试了所有可能的方法,如UrlDecode,htmldecode,双重解码甚至Java UrlDecode,但没有任何工作,并且始终在Fiddler中显示编码的URL。

请建议如何克服这个问题或任何替代新的Uri(url-string,true)旧函数。

UPDATE:

花了几个小时后,我可能找到了罪魁祸首。问题是

当我使用“new Uri(url,true)”时,它会发送包含|的非转义URL (管道)到WebRequest.Create但是如果我删除“true”它会发送编码的URL,这会产生结果,但不幸的是服务器不理解,所以我收到错误。

Uri ourUri = new Uri(url, true);
myHttpWebResponse1 = (System.Net.HttpWebResponse)request.GetResponse();

但它可能是一个bug.GetResponse()停止工作而不抛出任何异常并且进程挂起如果我使用| URL中的(管道)。

任何可能的解决方案?

我的完整功能如下(使用硬编码URL修改)

public static string getURLCustom(string GETurl, string GETreferal)
{
    GETurl = "http://example.com/?req=111111|wwww|N|2014|asdwer4";
    GETreferal = "";
    Uri ourUri = new Uri(GETurl.Trim(), true);
    HttpWebRequest request = (HttpWebRequest)(WebRequest.Create(ourUri));
    request.Method = "GET";
    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)";
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    request.KeepAlive = true;
    request.CookieContainer = loginCookie; //stored after login
    request.ContentType = "application/x-www-form-urlencoded";
    request.Referer = GETreferal;
    request.AllowAutoRedirect = true;
    HttpWebResponse myHttpWebResponse1 = default(HttpWebResponse);
    myHttpWebResponse1 = (System.Net.HttpWebResponse)request.GetResponse();
    StreamReader postreqreader1 = new StreamReader(myHttpWebResponse1.GetResponseStream());
    return postreqreader1.ReadToEnd();
}

是的,这段代码在.NET 2.0 Windows应用程序中运行得很好,但在Xamarin Mono-Touch App上却没有。

1 个答案:

答案 0 :(得分:1)

您连接的服务器似乎不支持国际化资源标识符(IRI)。

默认情况下启用IRI,因为单声道3.10。 mono 3.10 release notes

您可以通过执行以下操作在客户端应用程序上禁用它:

FieldInfo iriParsingField = typeof (Uri).GetField ("s_IriParsing",
    BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic);
if (iriParsingField != null)
    iriParsingField.SetValue (null, false);

您还可以通过将环境变量MONO_URI_IRIPARSING设置为false来禁用IRI解析。