【问题标题】:Url with square brackets in webClient.DownloadStringwebClient.DownloadString 中带方括号的 URL
【发布时间】:2014-08-12 18:36:38
【问题描述】:

我正在尝试从需要在 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 标准。我不知道该怎么做。但是……我知道我需要做什么,这很重要!

【问题讨论】:

  • 根据您的更新,我认为您需要更新网络服务。
  • 当它应该被转义时,服务器如何期望原始[?这可以被视为预期的行为吗?有可能吗?
  • 如我尝试连接的服务器?这不是我构建的......虽然源代码可用......我认为改变整个 api 超出了我的范围......
  • 如果服务器期待一个转义字符,那么在已经转义的网络浏览器中输入请求也应该可以,对吧? %5Btrue%5D 会起作用吗?就像将带有特殊字符的 google 链接粘贴到浏览器中一样,会将您带到正确的位置?因为我尝试将请求粘贴到 Web 浏览器中,用转义码代替括号并得到相同的代码 500 错误。

标签: c# downloadstring


【解决方案1】:

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);

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

【讨论】:

  • 我刚刚尝试按照您的建议将 [ 和 ] 替换为 %5B 和 %5D ,但它仍然不起作用。感谢您的建议!还有其他想法吗?
  • 嗯,“不起作用”怎么办?还要更新主要问题?
【解决方案2】:

我终于找到了一个有同样问题的人的古老帖子! 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);

【讨论】:

  • new Uri(Address, true) 不再有效,因为它已被弃用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多