防止C#在查询字符串中编码括号

时间:2010-12-11 21:18:53

标签: c# http httpwebrequest request

我需要使用一个服务,该服务接受一个名为&#34的GET参数; names []"。

例如:GET http://example.com/name2id?names[]=john

当我尝试使用WebClient在C#中使用它时,括号被编码为%5B%5D,服务器无法理解。当我使用我的浏览器(未编码)发送上述内容时,一切正常。

这是不起作用的例子:

using (var client = new System.Net.WebClient())
{
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john"));
}

由提琴手监视,继承人请求:

GET http://example.com/name2id?names%5B%5D=john HTTP/1.1
Host: example.com
Connection: Keep-Alive

有没有办法让框架不对URL进行编码,或者以其他方式解决这个问题?

P.S。我不控制API所以我无法改变它。

更新

这有点奇怪。我找到了一个解决方案,将我的C#代码更改为:

using (var client = new System.Net.WebClient())
{
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john", true));
}

请注意Uri中的布尔dontEscape。它实际上已被弃用,但它有效吗?谁能解释一下呢?

5 个答案:

答案 0 :(得分:1)

据我所知,RFC2396 []在URI中不是有效字符。因此,我认为您的服务需要格式错误的http请求。

query         = *uric
uric          = reserved | unreserved | escaped
unreserved    = alphanum | mark
mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
escaped       = "%" hex hex

http://www.ietf.org/rfc/rfc2396.txt

答案 1 :(得分:0)

你确定编码的字符是真正的问题吗?

WebClient类正确编码字符。如果服务无法处理正确编码的字符,则服务将中断。

如果服务以这种方式被破坏,你必须使用它,那么你必须找到一种不同的方式来发送请求。

答案 2 :(得分:0)

从技术上讲,将[]编码为%5B%5D是正确的,所以问题不是使用[],而是提供程序没有正确地对路径/查询字符串进行解码

http://www.albionresearch.com/misc/urlencode.php

答案 3 :(得分:0)

您应该只能将URI作为字符串传递

这样做

 response = client.DownloadString("http://example.com/name2id?names[]=john");

无需编码网址即可使用。

虽然没试过,所以我可能错了。

答案 4 :(得分:0)

如CodeInChaos所述,根据RFC2396,URL无效。

要使C#不能转义无效字符,URI的重载方法可以使用:

new Uri("http://example.com/name2id?names[]=john", true)

但是,这种方法已被弃用,但显然它仍然有效。我必须忍受警告弹出:)