1

我正在尝试从需要在 url 请求中使用方括号的网址执行 http GET - 例如:

string requestconstructor = "http://address:port/datalink?test.a[somestuff]"
System.Net.WebClient webClient = new System.Net.WebClient();
string result = webClient.DownloadString(requestconstructor);

我尝试将 webclient 编码设置为 utf8 和 ascii,并尝试将字符串声明中的方括号分别替换为 \u00b5 和 \u00b6 以直接对其进行编码,但这些方法都没有向服务器发送有效字符串. 我尝试在 downloadstring 调用中的 requestconstructor 前面放置一个 @ 符号...

我可以将引号中的内容准确复制并粘贴到网络浏览器中,并且效果很好。我可以使用我必须的代码向不需要方括号的服务器功能发出请求,这也可以。

有没有办法使用这些字符发出请求?

谢谢!

更新:我尝试了建议的代码,包括手动包含转义码和使用 Uri.EscapeDataString ,但它仍然失败。每次失败,服务器返回代码 500,如果您在网络浏览器的 url 栏中输入错误的请求,返回的代码与返回的代码相同。

我认为问题在于服务器希望这些字符不会被转义,甚至在我开始尝试在您的帮助下手动进行操作之前,webclient 可能已经自动转换它们?有没有办法让 webclient 在不编码的情况下完全按原样发送字符串?或者是否有 .encoding 属性的设置可以将 [ 和 ] 作为平面文本而不是特殊字符代码传输?这就是我在最初的努力中试图用 @ 做的事情。

更新 2 - 我加载了 Fiddler 来分析请求......而且我的诊断是正确的......当我将 url 键入 chrome fiddler 时,它显示它包括“[stuff]”。当我通过 c# 加载相同的地址时,它会显示为“%5Bstuff%5D”。所以我必须说服 c# 以我输入的方式发送 url 请求,而不是试图提供帮助并使其符合 web 标准。我不知道该怎么做。但是……我知道我需要做什么,这很重要!

4

2 回答 2

2

webbrower 会自动对其进行编码,而 WebClient 则不会。

有效的编码 URI 是"http://address:port/datalink?test.a%5Bsomestuff%5D". 要从代码中转义它,请使用其中一种转义方法,例如。

var path = "http://address:port/datalink";
var query = "test.a[somestuff]";
var uri = path + "?" + Uri.EscapeUriString(query);

使用@""没有效果,因为这只影响字符串文字解析。

于 2014-08-12T18:41:36.940 回答
0

我终于找到了一个有同样问题的人的古老帖子!Uri(string, boolean) 构造函数让你保证你已经完成了所有的转义,即使你在撒谎。工作代码在这里 -

 string address = "http://127.0.0.1:8085/datalink?a=stuff[true]";
Uri uri = new Uri(address, true);
WebClient client = new WebClient();
string reply = client.DownloadString(uri);
于 2014-08-13T05:23:20.230 回答