кодирование заголовка c# HttpWebResponse

Используя иногда продуктивный счетчик. По моему опыту, необходимо всегда выключать сообщение об ошибке в php.ini или вызове

error_reporting(0);

на месте производства. Таким образом, когда Вы находитесь в разработке, можно просто прокомментировать строку и сохранить ошибки видимыми для отладки.

8
задан David d C e Freitas 25 April 2011 в 07:25
поделиться

2 ответа

Если вы разрешите поведение по умолчанию ( loHttp.AllowAutoRedirect = true ) и ваш код не работает (вы не перенаправляетесь на новый ресурс), это означает что сервер неправильно кодирует заголовок Location . Работает ли перенаправление в браузере?

Например, если URL-адрес перенаправления http: // site / Μία_Σελίδα , заголовок Location должен иметь вид 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 содержит греческие символы, не закодированные по URL. Я не совсем уверен, действительно ли это согласно спецификации 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.

6
ответ дан 5 December 2019 в 20:16
поделиться

Я бы не ожидал, что возвращаемая строка будет искажена ... как вы определяя, что он уродлив? Строка должна быть в формате Unicode, например, utf-8, чтобы можно было легко представить греческую строку.

Может быть, у вас просто нет греческих шрифтов для представления строки?

1
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: