HttpWebRequest有时会错误地解码部分查询参数

时间:2017-01-17 12:12:38

标签: c# .net httpwebrequest system.net.httpwebrequest

我发现HttpWebRequest对象中似乎有些东西。

如果我运行以下内容:

var q = "кот (";

(注意这里'кот'是用俄语写的,显然它意味着猫。)

 var encoded = Uri.EscapeDataString(q);
 var url = $"https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q={encoded}";

我在url中得到以下值:

https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20%28

如果我然后运行:

var r = (HttpWebRequest)WebRequest.Create(url);
r.GetResponse();

在Fiddler中,观察到上述内容实际上是在提出请求:

https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(

请注意(不是像我构建HttpWebRequest时那样编码为%28。

如果我使用:

q = "CAT ("

即。没有俄文字符,只有拉丁语(?),我把它作为URL:

https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT%20%28

这也是也是在Fiddler中观察到的请求。

总结一下,当混合拉丁语和非拉丁语字符时,(似乎没有发送编码。

有人有任何建议如何解决这个问题吗?

更新: 这很重要,因为据我所知,这是我无法成功向Twitter提出这些API查询的原因,因为它似乎打破了我们的OAuth1签名,我们得到: 需要HTTP / 1.1 401授权 {“errors”:[{“code”:32,“message”:“无法对您进行身份验证。”}}}

我甚至可以在Fiddler中编辑失败的请求并替换(在GET请求中使用%28,然后成功使用此单个更改重播它。

1 个答案:

答案 0 :(得分:0)

这可能会有所帮助......看来Uri类的行为如下:

var q = "кот (";

var encoded = Uri.EscapeDataString(q);
// encoded = %D0%BA%D0%BE%D1%82%20%28

var uri = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=" + encoded);
// uri.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(

var uri2 = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT (");
// uri2.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT%20(

var uri3 = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=кот (");
// uri3.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(

我目前无法调试.NET Framework代码,但我怀疑使用Uri.EscapeDataString可能是不正确的WRT非拉丁字符和括号?

带有未编码括号的请求是否真的有效?如果是这样,我会建议括号不需要编码......

更新:我认为这可能是Uri中的一个错误?