我试图从网址中执行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失败时,如果您在Web浏览器的URL栏中输入错误请求,则返回相同的代码。
我认为问题是服务器希望这些字符不会被转义,甚至在我开始尝试手动帮助之前,webclient可能已经自动转换它们了吗?有没有办法让webclient在没有编码的情况下完全按原样发送字符串?或者是否有.encoding属性的设置可能会传输[和]作为平面文本而不是特殊字符代码?这是我在初期努力中试图用@做的事情。
更新2 - 我加载了Fiddler来分析请求......我的诊断是正确的...当我将网址输入chrome fiddler时,它显示为包括' [stuff]'。当我通过c#加载相同的地址时,它出现为'%5Bstuff%5D'。因此,我必须说服c#按照我输入的方式发送网址请求,而不是试图提供帮助并使其符合网络标准。我不知道该怎么做。但是......我知道我需要做什么,这是什么!
答案 0 :(得分:2)
webbrower会自动对其进行编码,而WebClient则不会。
有效的编码URI是"http://address:port/datalink?test.a%5Bsomestuff%5D"
。要从代码中转义它,请使用one of the escape methods例如
var path = "http://address:port/datalink";
var query = "test.a[somestuff]";
var uri = path + "?" + Uri.EscapeUriString(query);
使用@""
没有效果,因为它只影响字符串文字解析。
答案 1 :(得分:0)
我终于找到了有同样问题的人的古老帖子! Uri(字符串,布尔值)构造函数允许您承诺已经完成了所有的转义,即使您正在撒谎。工作代码在这里 -
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);