C# .NET — HttpWebRequest — System.Net.WebException — слишком много попыток автоматического перенаправления

У меня проблема с классом HttpWebRequest.
Я пытаюсь получить исходный код веб-сайта:
http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983
но я всегда получаю сообщение об ошибке:

System.Net.WebException occurred
  HResult=-2146233079
  Message=Too many automatic redirections were attempted.
  Source=System
  StackTrace:
       at System.Net.HttpWebRequest.GetResponse()
       at ProjectName.ClassName.MethodName(String urlAddress)
  InnerException: 

Это мой код:

Uri uri = new Uri(@"http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Я использовал инструмент Fiddler Web Debugger, чтобы сравнить запрос Firefox с моим запросом C# .NET, но до сих пор не получил ответа.

Firefox:

GET http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983 HTTP/1.1
Host: www.filmweb.pl
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive


HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate
Content-Type: text/html;charset=UTF-8
Content-Language: pl-PL
Transfer-Encoding: chunked
Date: Wed, 07 Oct 2015 13:36:31 GMT
X-Cache: HIT from blade110.non.3dart.com
X-Cache-Hits: 116
Server: Apache

С# .NET:

GET http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci:+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983 HTTP/1.1
Host: www.filmweb.pl
Connection: Keep-Alive


HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate
Content-Type: text/html;charset=UTF-8
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Language: pl-PL
Location: /film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983
Content-Length: 0
Accept-Ranges: bytes
Date: Wed, 07 Oct 2015 13:34:51 GMT
X-Cache: MISS from blade712.non.3dart.com
Server: Apache

Я прочитал другие сообщения и обновил свой код разными вещами, например.

request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.TransferEncoding = "gzip, deflate";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0";

request.Referer = "http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983";
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.MaximumAutomaticRedirections = 250;
request.Proxy = null;
request.UseDefaultCredentials = true;

CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;

но ничего не работает :-/

Может ли кто-нибудь помочь мне с этой проблемой?


person Marek    schedule 07.10.2015    source источник
comment
Я пытаюсь получить исходный код веб-сайта, если бы он был вашим, он бы у вас уже был.   -  person Fred    schedule 07.10.2015


Ответы (1)


У вас должны быть первоначальные файлы cookie при загрузке веб-сайта, прежде чем вы получите прямую ссылку.

У меня работает следующий код:

//  cookies
CookieContainer cookieContainer = new CookieContainer();

// make one call to the root of the website
// to get the cookies set
Uri uri = new Uri(@"http://www.filmweb.pl");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.CookieContainer = cookieContainer;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using(var s = response.GetResponseStream())
{
   using(var sr = new StreamReader(s)) 
   {
      // linqpad
      sr.ReadToEnd().Dump(); // to check for errors
   }
}

// we have cookies now
// do the deep link fetch
uri = new Uri(@"http://www.filmweb.pl/film/Igrzyska+%C5%9Bmierci%3A+Kosog%C5%82os.+Cz%C4%99%C5%9B%C4%87+1-2014-626983");
request = (HttpWebRequest)WebRequest.Create(uri);
request.CookieContainer = cookieContainer;
response = (HttpWebResponse)request.GetResponse();

//store the result
using(var f = File.Create("C:\\temp\\pl.txt"))
{
    response.GetResponseStream().CopyTo(f);
}

Если вы очищаете веб-сайт, убедитесь, что вы придерживаетесь их политики лицензирования и использования. Не делайте ничего, что выходит за рамки добросовестного использования или противоречит любым материалам, защищенным авторским правом.

person rene    schedule 07.10.2015
comment
Я делаю приложение только для частного использования, чтобы помочь мне переименовать папки на моем жестком диске, содержащие резервную копию коллекции фильмов, потому что я перестал использовать диски и хочу, чтобы все было с красивыми именами. Я не знаю, нужно ли мне следить за этим для этого использования, но я проверю это. Спасибо! :-) - person Marek; 07.10.2015