c#使用带URL编码的西里尔字符的URL的WebClient问题

时间:2011-02-15 04:53:49

标签: c# webclient

我正在尝试从Web服务器加载一个文件,其中包含一个包含带有西里尔字符的参数的请求URL。 但即使我对URL进行编码,我也不会在c#中使用它。

当我用IE打开IE页面时 http://translate.google.com/translate_tts?tl=ru&q =ЗДРАВСТВУЙТЕ
服务器没有响应。

使用URL编码版本
http://translate.google.com/translate_tts?tl=ru&q=%d0%97%d0%94%d0%a0%d0%90%d0%92%d0%a1%d0%a2%d0%92%d0%a3%d0%99%d0%a2%d0%95
服务器按预期响应。

现在我的问题:
我想从C#下载MP3 ...

var url = string.Format("http://translate.google.com/translate_tts?tl=ru&q={0}", 
          Server.UrlEncode("ЗДРАВСТВУЙТЕ"));
System.Net.WebClient client = new WebClient(); 
var res = client.DownloadData(url);

这不适用于西里尔字母。我总是得到一个零字节的答案,就像第一个非编码请求一样。 当我发送“普通”字符时,上面的代码工作正常。

所以......我做错了什么。 任何提示?的窍门?溶液

感谢
迈克尔

2 个答案:

答案 0 :(得分:3)

您必须为WebClient设置用户代理 - 这有效:

string url = "http://translate.google.com/translate_tts?tl=ru&q=ЗДРАВСТВУЙТЕ";
WebClient client = new WebClient();
client.Headers.Add("user-agent", 
                   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
var res = client.DownloadData(url);

来自msdn documentation

  

WebClient实例不发送   默认情况下可选的HTTP标头。如果   您的请求需要可选   标题,您必须添加标题   标题集合。例如,到   在你的回复中保留查询   必须添加用户代理标头。也,   服务器可能返回500(内部   服务器错误)如果是用户代理标头   不见了。

答案 1 :(得分:0)

尝试添加

client.Encoding = System.Text.Encoding.UTF8;

我不使用用户代理标题,但对我来说它有效:

WebClient client = new WebClient();
client.Encoding = System.Text.Encoding.UTF8;
string response = client.DownloadString(_url);