我见过很多关于使用不合格的Uris的帖子,但没有一个有好的答案。我正在编写Windows Phone控件,它需要使用HTTP GET请求ATOM数据。 URL需要包含字符%3d(等号)。这是不可协商的,因为它是我无法控制的第三方服务。想象一下如下的URL:
http://host.com?arg1=val1&arg=val2%3d
我正在使用带有DownloadStringAsync的WebClient,但它只接受Uri对象,而不接受字符串中的URL。 Uri对象自动取消那些字符并发送:
http://host.com?arg1=val1&arg=val2=
这失败了。有一个弃用的构造函数参数“UserExcaped”正是我需要的,但它不可用。我担心我唯一的选择是使用原始套接字和最小的HTTP支持来实现我自己的字符串下载方法。
还有其他想法吗?非常感谢帮助!!
更新
string apps = "http://blah.com/api?prev=AAAAAAA%3d&next=BBBBBBB";
var u = new Uri(apps);
string apps2 = u.ToString();
Debug.Assert(apps == apps2); // That %3d will always be converted to an equals sign
我还要指出的是,如果我尽量巧妙的通过编码的百分比为%25(所以它的“上一页= AAAAAA%253D和放大器;未来= BBBBB”),然后我得到的确切文本字符串与%25依然完好!只需%3d即可转换为等号。
答案 0 :(得分:1)
Uri
类就是这样的。 MSDN:
作为某些方案的构造函数中规范化的一部分, 转义表示被压缩。 URI将采用的方案 紧凑转义序列包括以下内容:文件, http ,https, net.pipe和net.tcp。对于所有其他方案,转义序列是 没有压缩。
您是否尝试过使用HttpWebRequest?它比WebClient要多一些,但它允许你传递一个字符串作为目的地。
编辑 - 另一种方法可能是创建自己的UriParser
,它允许编码版本。扩展UriParser
的示例可以是found here。
对于其他不运行Windows Phone,您可以使用reflection
来解决此问题。
MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
foreach (string scheme in new[] { "http", "https" })
{
UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
if (parser != null)
{
int flagsValue = (int)flagsField.GetValue(parser);
//0x20000 is the SimpleUserSyntax attribute
if ((flagsValue & 0x20000) != 0)
flagsField.SetValue(parser, flagsValue & ~0x20000);
}
}
}
Uri u = new Uri("http://host.com?arg1=val&arg=val2%3d");
//At this point, the %3d remains as expected.
答案 1 :(得分:0)
尝试使用Hammock - 你应该能够给它一个字符串而不是一个Uri。