2011-02-15 2 views
0

키릴 문자가있는 매개 변수가 포함 된 요청 URL을 사용하여 웹 서버에서 파일을로드하려고합니다. 하지만 C#에서 작동하도록하지는 않습니다. URL 인코딩을 사용하더라도 마찬가지입니다. 내가
http://translate.google.com/translate_tts?tl=ru&q = ЗДРАВСТВУЙТЕ
와 IE에서 페이지를 열 때URL 인코딩 된 키릴 문자가있는 URL을 사용하는 WebClient 문제

서버가 응답하지 않습니다.

예상대로
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
서버가 응답하는 URL 인코딩 된 버전을 사용.

지금 내 문제 :
나는 ... 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); 

을 MP3를 다운로드 할 그리고 이것은 키릴 문자와 함께 작동하지 않습니다. 나는 항상 인코딩되지 않은 첫 번째 요청과 같은 0 바이트 응답을 얻는다. "정상"문자를 보내면 위의 코드가 정상적으로 작동합니다.

그래서 ... 나는 잘못된 것을하고 있습니다. 힌트가 있습니까? 티프스? 솔루션?

감사
마이클

답변

3

당신은 WebClient에 대한 사용자 에이전트를 설정해야합니다 -이 작품 다음 msdn documentation에서

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

:

웹 클라이언트 인스턴스는 보내지 않습니다 기본적으로 HTTP 헤더가 선택적입니다. 요청에 헤더 (선택 사항)가 필요한 경우 헤더를 헤더 컬렉션에 추가해야합니다. 예를 들어 응답에 쿼리를 보유하려면 에 사용자 에이전트 헤더를 추가해야합니다. 또한 사용자 에이전트 헤더가 누락 된 경우 서버는 500 (내부 서버 오류)을 반환 할 수 있습니다.

+3

이 좋은 작품, 감사합니다. 내가 이해할 수 있도록 : 키릴 문자 URL을 보낼 때 사용자 에이전트가 필요하고 라틴 URL을 보내지 않는 이유는 무엇입니까? – Dark

0

봅니다

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

내가 사용자 에이전트 헤더를 사용하지 않는 추가 할 수 있지만 나를 위해 그것을 작동 :

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