문제

다음과 같은 문제가 있습니다.301 리디렉션을 사용하는 것으로 알고 있는 주소로 연락합니다.

사용하여 HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);그리고 loHttp.AllowAutoRedirect = false; 리디렉션되지 않도록 합니다.

이제 새 URL을 식별하기 위해 응답 헤더를 얻습니다.

사용하여 loWebResponse.GetResponseHeader("Location");

문제는 이 URL에 그리스 문자가 포함되어 있기 때문에 반환된 문자열이 인코딩으로 인해 모두 뒤죽박죽된다는 것입니다.

코드별 전체 그림은 다음과 같습니다.

HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
loHttp.ContentType = "application/x-www-form-urlencoded";
loHttp.Method = "GET";

Timeout = 10000;

loHttp.AllowAutoRedirect = false;
HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

string url= loWebResponse.Headers["Location"];
도움이 되었습니까?

해결책

기본 동작을 보자.loHttp.AllowAutoRedirect = true) 그리고 코드가 작동하지 않습니다 (새 리소스로 리디렉션되지 않음) 서버가 인코딩하지 않음을 의미합니다. Location 헤더가 올바르게. 리디렉션이 브라우저에서 작동합니까?

예를 들어 리디렉션 URL 인 경우 http://site/Μία_Σελίδα 위치 헤더는 모양이 있어야합니다 http://site/%CE%95%CE%BD%CE%B9%CE%B1%CE%AF%CE%BF_%CE%94%CE%B5%CE%.


업데이트:

이 문제를 더 조사한 후 나는 무언가가 있다고 의심하기 시작합니다. 이상한 ~와 함께 HttpWebRequest. 요청이 전송되면 서버는 다음 응답을 보냅니다.

HTTP/1.1 301 Moved Permanently
Date: Fri, 11 Dec 2009 17:01:04 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Location: http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/
Content-Length: 112
Content-Type: text/html; Charset=UTF-8
Cache-control: private
Connection: close
Set-Cookie: BIGipServerpool_webserver_gr=1007732746.36895.0000; path=/


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

우리가 볼 수 있듯이 Location 헤더에는 인코딩되지 않은 그리스 문자가 포함되어 있습니다. 이것이 유효한지 확실하지 않습니다. HTTP 사양. 우리가 확실히 말할 수있는 것은 웹 브라우저가 올바르게 해석한다는 것입니다.

여기에 흥미로운 부분이 온다. 그것은 것 같습니다 HttpWebRequest UTF-8 인코딩을 사용하여 응답 헤더를 구문 분석 할 때 Location 헤더는 다음과 같습니다. http://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/, 물론 틀린 것과이 위치로 리디렉션하려고 할 때 서버는 최대 리디렉션 수에 도달하고 예외가 발생할 때까지 새 리디렉션으로 응답합니다.

사용한 인코딩을 지정할 방법을 찾을 수 없었습니다. HttpWebRequest 응답 헤더를 구문 분석 할 때. 우리가 사용하는 경우 tcpclient 수동으로 완벽하게 작동합니다.

using (var client = new TcpClient())
{
    client.Connect("www.site.com", 80);

    using (var stream = client.GetStream())
    {
        var writer = new StreamWriter(stream);
        writer.WriteLine("GET /default/defaultcatg.asp?catg=69569 HTTP/1.1");
        writer.WriteLine("Host: www.site.com");
        writer.WriteLine("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090805 Shiretoko/3.5.2");
        writer.WriteLine("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        writer.WriteLine("Accept-Language: en-us,en;q=0.5");
        writer.WriteLine("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        writer.WriteLine("Connection: close");
        writer.WriteLine(string.Empty);
        writer.WriteLine(string.Empty);
        writer.WriteLine(string.Empty);
        writer.Flush();

        var reader = new StreamReader(stream);
        var response = reader.ReadToEnd();
        // When looking at the response it correctly reads 
        // Location: http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/
    }
}

그래서 나는이 행동에 정말 당황합니다. 사용한 올바른 인코딩을 지정하는 방법이 있습니까? HttpWebRequest? 일부 요청 헤더가 설정되어야합니까?

해결 방법으로 수정을 시도 할 수 있습니다 asp 리디렉션 및 UrlenCode를 수행하는 페이지 Location 헤더. 예를 들어 ASP.NET 응용 프로그램에서 Response.Redirect(location), 위치는 자동으로 HTML 인코딩되고 모든 비 표준 문자는 해당 엔티티로 변환됩니다.

예를 들어, 당신이하는 경우 : Response.Redirect("http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/"); ASP.NET 응용 프로그램에서 Location 헤더는 다음으로 설정됩니다.

http://www.site.com/buy/%ce%ba%ce%b9%ce%bd%ce%b7%cf%84%ce%ae-%cf%83%cf%84%ce%b1%ce%b8%ce%b5%cf%81%ce%ae-%cf%84%ce%b7%ce%bb%ce%b5%cf%86%cf%89%ce%bd%ce%af%ce%b1/c/cn69569

이것은 클래식 ASP의 경우가 아닌 것 같습니다.

다른 팁

나는 반환 문자열이 기형 될 것으로 기대하지 않을 것입니다 ... 어떻게 기형이 있다고 판단하고 있습니까? 문자열은 그리스 문자열을 쉽게 표현할 수있는 UTF-8과 같은 유니 코드 형식이어야합니다.

문자열을 나타내는 그리스 글꼴이 없을 수도 있습니까?

Darin Dimitrov가 설명했듯이 헤더 인코딩은 HttpWebResponse 클래스의 버그로 인해 발생한다고 생각합니다.헤더(Set-Cookie)에 쿠키를 추가하려고 하는데 이 쿠키에 ASCII가 아닌 문자가 포함되는 것과 동일한 문제가 발생했습니다.특별한 경우에는 노르웨이 문자 'Æ', 'Ø' 및 'Å'(대문자 및 소문자)가 됩니다.우리는 그것을 얻는 방법을 알 수 없었습니다 HeaderEncoding 작동하지만 다음을 사용하여 해결 방법을 찾았습니다. Base64 인코딩 쿠키의. 이는 클라이언트와 서버 측을 모두 제어할 수 있는 경우에만 작동합니다. (또는 서버측 코드 담당자에게 Base64 인코딩을 추가하도록 설득할 수도 있습니다...)

서버 측에서:

var cookieData = "This text contains Norwegian letters; ÆØÅæøå";
var cookieDataAsUtf8Bytes = System.Text.Encoding.UTF8.GetBytes(cookieData);
var cookieDataAsUtf8Base64Encoded = Convert.ToBase64String(cookieDataAsUtf8Bytes);
var cookie = new HttpCookie("MyCookie", cookieDataAsUtf8Base64Encoded);
response.Cookies.Add(cookie);

클라이언트 측에서:

var cookieDataAsUtf8Bytes = Convert.FromBase64String(cookieDataAsUtf8Base64Encoded);
var cookieData = System.Text.Encoding.UTF8.GetString(cookieDataAsUtf8Bytes);

참고하세요 cookieDataAsUtf8Base64Encoded 클라이언트 측에는 쿠키의 데이터 부분이 있습니다(즉, 'MyCookie=[data]', 여기서 'MyCookie='는 제거됩니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top