文字Uri请求

时间:2012-01-13 19:09:28

标签: c# windows-phone-7 uri

我见过很多关于使用不合格的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即可转换为等号。

2 个答案:

答案 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。