Uri 忽略特殊字符
Posted
技术标签:
【中文标题】Uri 忽略特殊字符【英文标题】:Uri ignore special characters 【发布时间】:2013-12-11 06:23:57 【问题描述】:我得到一个代表 url 的字符串,我想通过 c# 下载内容
我的网址包含 right to left mark 和 left to right mark %E2%80%8F & %E2%80%8E。
当我将 url 粘贴到浏览器中时,我可以显示该文件。 当我在 .net 中使用代码时出现错误(因为 .net 会忽略这些标记并且不会在请求中发送它们。
这是我得到的查询字符串
/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2 %D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28 %E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95% D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1 %D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7 %97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7% 95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf
使用小提琴我可以发送.net
/MBA%20(1)/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2% D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20(%EF %BB%BF13015)/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20 %D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99% D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7% A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7 %97%D7%91.pdf
你会发现标记不见了。
知道怎么解决吗?
这里有一些代码: var s = "https://dl.dropboxusercontent.com/1/view/4fsaouo0ob52xkz/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2%D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28%E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf";
using (HttpClient client = new HttpClient())
using (var sr = client.GetAsync(s).Result)
Console.WriteLine(sr.Headers);
我尝试手动创建 uri 并将其传递给 httpClient - 保存结果。 sr - 得到 403 错误代码而不是 200(我提供的链接无效但最终结果相同)。
【问题讨论】:
好的,这个问题只发生在 .net 4.5 和 .net 4.5.1 上。在 .net 4 和 3.5 上不会出现此问题 System.Uri 在 .net 4.5 中已更改。不幸的是,它在 HttpClient、WebClient 和 HttpWebrequest 中使用。 @LostInComputer - 我读到 .net 4.5 更改了 Uri。有什么办法可以通过吗?在不使用 Uri 的情况下进行 http 调用? @Ram 不知道任何内部不使用 Uri 的内置 .net 类 我收到未授权状态码 【参考方案1】:试试这个:
var uri = "https://dl.dropboxusercontent.com/1/view/4fsaouo0ob52xkz/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2%D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28%E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf";
string Url= System.Web.HttpUtility.UrlDecode(uri);
//objDataToXml.GenerateXml();
using (HttpClient client = new HttpClient())
using (var sr = client.GetAsync(Url).Result)
Console.WriteLine(sr.Headers);
【讨论】:
以上是关于Uri 忽略特殊字符的主要内容,如果未能解决你的问题,请参考以下文章