2011-02-15 108 views
0

我试图从web服务器加载包含带西里尔字符参数的请求URL的文件。 但我没有得到这个工作在C#中,即使我的网址编码的参数。c#使用带URL编码西里尔字符的URL的WebClient问题

当我在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); 

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

所以......我做错了什么。 任何提示?的窍门?解决方案?

感谢
迈克尔

回答

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(内部 服务器错误)。

+3

伟大的作品,谢谢。只是为了让我明白:为什么我需要用户代理,当我发送西里尔-URL和拉丁URL? – Dark 2011-02-17 04:43:39

0

尝试添加

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

我不使用User-Agent头但对我来说它的工作原理:

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