2013-11-22 6 views
2

У меня есть элемент управления веб-браузером, который загружает страницу. Затем я нажал кнопку для вызова этого метода:C# cookie веб-браузера в httpwebrequest

public void get(Uri myUri) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri); 
     CookieContainer cookieJar = new CookieContainer(); 
     cookieJar.SetCookies(webBrowser1.Document.Url,webBrowser1.Document.Cookie.Replace(';', ',')); 
     request.CookieContainer = cookieJar; 


     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     int cookieCount = cookieJar.Count; 

     Stream receiveStream = response.GetResponseStream(); 
     StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); 

     txt.Text = readStream.ReadToEnd(); 


      txt2.Text = cookieCount.ToString(); 


    } 

Как из cookieCount Int я могу видеть, что если я вызвать метод перед входом в страницы в элементе управления веб-браузера, я хотел бы получить 6 печенье, и после того, как я вхожу в систему, я получаю 7. Однако даже с кукисами ответ, который я получаю, такой же, как если бы я не был зарегистрирован. Так что я предполагаю, что файлы cookie не отправляются с запросом?

Спасибо!

ответ

0

вы повторно CookieContainer каждый раз, когда вы вызываете этот метод, вы должны использовать один и тот же CookieContainer во всех запросах

вы можете использовать этот код, чтобы обрабатывать ваши запросы:

 static CookieContainer cookies = new CookieContainer(); 

     static HttpWebRequest GetNewRequest(string targetUrl, CookieContainer SessionCookieContainer) 
     { 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUrl); 
      request.CookieContainer = SessionCookieContainer; 
      request.AllowAutoRedirect = false; 
      return request; 
     } 

     public static HttpWebResponse MakeRequest(HttpWebRequest request, CookieContainer SessionCookieContainer, Dictionary<string, string> parameters = null) 
     { 


      request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5Accept: */*"; 
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      request.CookieContainer = SessionCookieContainer; 
      request.AllowAutoRedirect = false; 

      if (parameters != null) 
      { 
       request.Method = "POST"; 
       request.ContentType = "application/x-www-form-urlencoded"; 
       string postData = ""; 
       foreach (KeyValuePair<String, String> parametro in parameters) 
       { 
        if (postData.Length == 0) 
        { 
         postData += String.Format("{0}={1}", parametro.Key, parametro.Value); 
        } 
        else 
        { 
         postData += String.Format("&{0}={1}", parametro.Key, parametro.Value); 
        } 

       } 
       byte[] postBuffer = UTF8Encoding.UTF8.GetBytes(postData); 
       using (Stream postStream = request.GetRequestStream()) 
       { 
        postStream.Write(postBuffer, 0, postBuffer.Length); 
       } 
      } 
      else 
      { 
       request.Method = "GET"; 
      } 


      HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
      SessionCookieContainer.Add(response.Cookies); 


      while (response.StatusCode == HttpStatusCode.Found) 
      { 
       response.Close(); 
       request = GetNewRequest(response.Headers["Location"], SessionCookieContainer); 
       response = (HttpWebResponse)request.GetResponse(); 
       SessionCookieContainer.Add(response.Cookies); 
      } 


      return response; 
     } 

и запросить страницу,

HttpWebRequest request = GetNewRequest("http://www.elitepvpers.com/forum/login.php?do=login", cookies); 
Dictionary<string,string> parameters = new Dictionary<string,string>{{"your params","as key value"}; 


      HttpWebResponse response = MakeRequest(request, cookies, parameters); 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       if(!reader.EndOfStream) 
       { 
        Console.Write(reader.ReadToEnd()); 
       } 
      } 
+0

Спасибо! Я не могу заставить синтаксис кода запросить правильную страницу. Вы бы обернули в метод или что-то вроде этого? Я довольно новичок в C#. – user2725580

+0

здесь вы можете увидеть пример приложения, которое делает это, запрашивая http://stackoverflow.com/questions/11601621/httpwebrequest-another-page/11601883#11601883 –

1

При сопоставлении сеанса, ваш веб-сервер может принимать во внимание некоторые другие HTTP request headers, кроме печенья. Чтобы назвать несколько: User-Agent, Authorization, Accept-Language.

Потому что WebBrowser управления и WebRequest не обмениваются сеансами, вам нужно будет реплицировать все заголовки из сеанса WebBrowser. Это было бы трудно сделать, так как вам нужно было бы перехватить WebBrowser trafic, таким образом, как это делает Fiddler.

Более реальным решением было бы остаться на той же сессии с помощью WebBrowserWindows UrlMon APIs как URLOpenStream, URLDownloadToFile и т.д., вместо того, чтобы WebRequest. Это работает, потому что WebBrowser использует библиотеку UrlMon за сценой.

Я недавно ответил на некоторые связанные с ними вопросы:

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