2011-02-15 109 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);