2017-02-08 2 views
17

Я работаю над менеджером загрузки и пытается получить содержимое cookie, используя HttpWebRequest. Я хочу интегрировать свое приложение в Chrome, и поэтому я могу получить в браузере необходимые заголовки и значения cookie.Как узнать, какие файлы cookie необходимы для создания правильного HttpWebRequest?

Но сначала мне нужно знать, требуется ли файл cookie для загрузки контента и какие файлы cookie они есть. Я не могу найти полезный ресурс по этой теме.

Это то, что я представляю:

HttpWebRequest req = (WebRequest.Create(url)) as HttpWebRequest; 
//At first, get if cookies are necessary? 
//If it is, get the required cookie headers 
//Then add the cookies to the request 
CookieContainer cc = new CookieContainer(); 
Cookie c1 = new Cookie("header1", "value1"); 
Cookie c2 = new Cookie("header2", "value2"); 
CookieCollection ccollection = new CookieCollection(); 
ccollection.Add(c1); 
ccollection.Add(c2); 
cc.Add(uri, ccollection); 
req.CookieContainer = cc; 
//Get response and other stuff...... 

Как я могу сделать эти шаги?

+1

Посмотрите на это расширение в Chrome: http://www.editthiscookie.com/. Вы можете использовать его, чтобы узнать, какие файлы cookie используются веб-запросом/ответом. –

+0

Спасибо, но я хочу сделать это в коде C#, мне нужен только необходимый заголовок файла cookie –

ответ

5

Файлы cookie, необходимые для получения контента с сервера, указаны этим сервером в заголовке «Set-Cookie» HTTP-ответа. Общий сценарий:

  1. Клиент делает запрос HTTP на сервер (это может быть страница входа, или страницу загрузки)
  2. сервер отвечает ответ HTTP, который содержит «Set-Cookie» заголовок (s)
  3. Клиент запоминает все эти куки
  4. Клиент использует куки, хранящиеся на шаге 3 для всех последующих запросов на том же сервере

Теперь, учитывая ваш сценарий интеграции в Chrome, я полагаю, что й e начальные запросы (шаги с 1 по 3) не будут выполняться вашим приложением, а самими Chrome. Файлы cookie будут храниться в хранилище файлов cookie Chrome. Так что вашему приложению нужно будет сделать, это получить от Chrome все файлы cookie для домена, в который вы хотите загрузить, и включить эти куки в свой запрос (шаг 4).

См. Документ chrome.cookies о том, как использовать API Chrome для взаимодействия со своим хранилищем файлов cookie, и Set-Cookie docs from Mozilla для подробного описания того, как файлы cookie указываются в ответе HTTP.

1

Это зависит от фактической загрузки, которую вы хотите выполнить, и требований к серверу. Большинство серверов позволят скачивать файлы независимо от файлов cookie.
Тем не менее, вы всегда можете отправлять файлы cookie на всякий случай. Какие файлы cookie вам нужны? Вот некоторые правила, как это делают браузеры: Cookie имеют атрибуты домена и пути. Домен применяется к субдоменам. Таким образом, если запрос сделан для http://foo.bar.com/some/path следующих куков будут отправлены:
-Those с областью ком, bar.com и foo.bar.com без пути
-Same, как предыдущие, но имеющие пути вроде/или некоторые некоторый/пути и т. д.

Он не будет отправлять файлы cookie из других доменов или из перечисленных выше доменов, но с путём, не указанным в пути запроса.

Итак, вам нужно будет искать файлы cookie одинаково в зависимости от URL-файла, который вы должны скачать.

1

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

без этого маркеров вы не можете выполнить скачать

Cookie для использования зависит сайт, вы не можете думаю, если веб-сайт нуждается в них или нет, которые необходимы или нет

Если вы используете .NET 4.5+, рассмотреть вопрос об использовании «WebRequest.CreateHttp» статический метод https://msdn.microsoft.com/fr-fr/library/ff382788(v=vs.110).aspx

Keep трек CookieContainer, он в конечном итоге будет заполняться новыми печенья от ответа (Set-Cookie заголовка в ответ)

Примечание: печенье связаны с доменом (т.е. stackoverflow.com) Я предлагаю вам установить куки расширение для браузера Chrome, чтобы играть с

+0

Является ли ответным файлом cookie нам какие файлы cookie необходимы? Также у меня есть расширение EditThisCookie для Chrome, но есть типы логина, безопасности, только cookieHttp и есть несколько файлов cookie, которые принадлежат каждому из них. Я не могу понять, какой файл cookie для входа. –

+0

Вы не можете определить, какие файлы cookie необходимы, даже в ответе.Куки-файлы зависят от сайта, также могут зависеть от технологии, которую использует веб-сайт (asp net, php ...), веб-разработчик также может использовать cookie с настраиваемым именем. Вы должны иметь дело со всеми кукисами из домена сайта – Shenron

1

Вместо этого я бы добавил комментарий, но не имел достаточного количества rep. Кажется, вы на правильном пути. Предложение Mateusz Radny об использовании EditThisCookie позволит вам исследовать файлы cookie, которые у вас есть в вашем браузере, но для любого конкретного веб-сервера обычно вам не нужно решать, какой файл cookie есть (так что вам действительно не нужно заботиться о том, login cookie).

Протокол для файлов cookie заключается в том, что браузер должен отправить обратно файлы cookie, которые веб-сервер первоначально отправил в браузер для данного веб-сайта.Может помочь прочитать немного больше о файлах cookie: https://en.wikipedia.org/wiki/HTTP_cookie (возможно, перейти на Реализация, а затем немного прочитать в Конфиденциальность и сторонние файлы cookie, потому что вы действительно не хотите делиться куки-файлами с одного веб-сайта с другими веб-сайтами).

Предполагая, что вы хотите эмулировать то, что отправил браузер, убедитесь, что ваш менеджер загрузок также отправляет тот же набор файлов cookie, что и Chrome, полученный с этого конкретного веб-сайта, и он должен работать. Также избегайте кэширования файлов cookie в вашем коде, так как ваш браузер будет обновлять файлы cookie (например, удалять истекшие файлы cookie), и поэтому вы всегда должны получать их из браузера каждый раз, когда вам это нужно.

* Примечание. Иногда cookie отмечен только для определенных типов подключений или для использования с определенным доменом/субдоменом или маршрутом Uri. Если установлено, то вы должны ограничить, когда вы отправляете их на основании, если оно соответствует соединению, которое вы пытаетесь сделать. Пожалуйста, изучите это отдельно (последние спецификации RFC: https://tools.ietf.org/html/rfc6265).

PS: веб-сервер может отправлять новые или обновленные куки-файлы как часть запроса на загрузку, сделанного с помощью диспетчера загрузки. Если вы действительно хотите быть идеальными, их следует скопировать из вашего менеджера загрузок обратно в набор файлов cookie Chrome (хотя я не знаком с API Chrome, поэтому не уверен, насколько это будет сложно).

1

Попытайтесь захватить файлы cookie с первого запроса (может быть страница входа в систему) и добавить все в следующий запрос (запрос на загрузку). Что-то вроде ниже.

public void MakeRequest() 
    { 
     var container = new CookieContainer(); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/loginpage"); 
     request.Method = WebRequestMethods.Http.Get; 
     request.CookieContainer = container; 

     HttpWebResponse response = null; 

     response = (HttpWebResponse)request.GetResponse(); 
     //once you read response u need to add all cookie sent in header to the 'container' so that it can be forwarded on second response 
     foreach (Cookie cookie in response.Cookies) 
     { 
      container.Add(cookie); 
     } 

     HttpWebRequest downRequest = (HttpWebRequest)WebRequest.Create("http://example.com/downloadpage"); 
     downRequest.Method = WebRequestMethods.Http.Get; 
     downRequest.Proxy = null; 

     //As you have added the cookies, this must response fine now 
     downRequest.CookieContainer = container; 
     response = (HttpWebResponse)downRequest.GetResponse(); 
     var stream = response.GetResponseStream(); 
    } 

Надеюсь, это поможет.

Смежные вопросы