2013-11-22 48 views
2

我有一個webbrowser控件加載一個頁面。 然後我打一個按鈕來調用這個方法:c#web瀏覽器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詮釋我可以看到,如果我叫在Web瀏覽器控件的頁面上登錄前的方法我會得到6塊餅乾,在我登錄後,我得到了7. 但是,即使使用cookie,我得到的響應也與我不會登錄的情況相同。 所以我猜測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

當匹配會話,Web服務器可能會考慮到一些其他HTTP request headers,除了餅乾。僅舉幾例:User-Agent,AuthorizationAccept-Language

因爲WebBrowser控制和WebRequest不共享會話,所以您需要複製WebBrowser會話中的所有標頭。這很難做到,因爲您需要攔截WebBrowser流量,方式與Fiddler類似。

一個更可行的解決方案可能是通過使用Windows UrlMon APIsURLOpenStreamURLDownloadToFile等留在同一個會話與WebBrowser,而不是WebRequest。這是有效的,因爲WebBrowser在幕後使用了UrlMon庫。

我最近回答了一些相關的問題: