c # Проблема WebClient с использованием URL-адреса с кодированными в URL кириллическими символами - PullRequest
0 голосов
/ 15 февраля 2011

Я пытаюсь загрузить файл с веб-сервера с URL-адресом запроса, который содержит параметр с кириллическими символами.Но я не могу заставить это работать в c #, даже если я 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);

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

Итак ... я делаю что-то не так.Есть намеки?Tipps?Решения?

Спасибо
Михаил

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Вы должны установить user-agent для 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 (внутренний Ошибка сервера) если заголовок пользовательского агента отсутствует.

0 голосов
/ 10 мая 2016

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

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

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

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