我正在使用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)旧函数。
花了几个小时后,我可能找到了罪魁祸首。问题是
当我使用“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上却没有。
答案 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解析。