c # Проблема WebClient с использованием URL-адреса с кириллическими символами в кодировке URL

Я пытаюсь загрузить файл с веб-сервера с URL-адресом запроса, который содержит параметр с кириллическими символами. Но я не заставляю это работать в С#, даже если я URL-кодирую параметр.

Когда я открываю страницу в 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
сервер отвечает ожидаемым образом.

Теперь моя проблема:
Я хочу скачать MP3 с C#...

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

И это НЕ работает с кириллическими символами. Я всегда получаю ответ с нулевым байтом, как и первый незакодированный запрос. Когда я отправляю «обычные» символы, приведенный выше код работает нормально.

Так что... я что-то не так делаю. Любые подсказки? Чаевые? Решения?

Спасибо
Майкл


person Dark    schedule 15.02.2011    source источник


Ответы (2)


Вы должны установить пользовательский агент для 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:

Экземпляр WebClient по умолчанию не отправляет необязательные заголовки HTTP. Если для вашего запроса требуется необязательный заголовок, вы должны добавить заголовок в коллекцию заголовков. Например, чтобы сохранить запросы в ответе, вы должны добавить заголовок пользовательского агента. Кроме того, серверы могут возвращать 500 (внутренняя ошибка сервера), если заголовок пользовательского агента отсутствует.

person BrokenGlass    schedule 15.02.2011
comment
Отлично работает, спасибо. Просто для того, чтобы я понял: зачем мне пользовательский агент, когда я отправляю кириллицу, а латиницу - нет? - person Dark; 17.02.2011

Попробуйте добавить

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

Я не использую заголовок пользовательского агента, но для меня это работает:

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