Если вы разрешите поведение по умолчанию (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.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.
person
Darin Dimitrov
schedule
11.12.2009
HttpWebRequest
будет следовать перенаправлениям, поэтому, если сервер отправляет код состояния301/302
, будет выдан новый запрос на получение ресурса с использованием заголовкаLocation
. Итак, как только этот последний ресурс будет получен, в ответе больше не будет заголовкаLocation
, поэтому мне интересно, как получается, чтоloWebResponse.GetResponseHeader("Location")
возвращает что-либо, кроме пустой строки. Помимо этого, вы проверили с помощьюFireBug
, что сайт правильно кодирует заголовокLocation
? - person Darin Dimitrov   schedule 11.12.2009