2011-06-16 38 views
0
private void button1_Click(object sender, EventArgs e) 
{ 
    string userName = textBox1.Text; 
    string password = textBox2.Text; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.youmint.com/LoginVerification.php?name="+userName+"&pass="+password+"&agreement=true&checkvalue=true"); 
    request.Method = "GET"; 
    request.KeepAlive = true; 
    request.Headers.Add("Keep-Alive: 300"); 
    WebResponse response = request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 
    if (responseFromServer.Equals("")) 
     MessageBox.Show("Successfully logged in!!"); 
    else if (responseFromServer.Equals("1")) 
     MessageBox.Show("Login failed!"); 
    request = (HttpWebRequest)WebRequest.Create("http://www.youmint.com/FreeSms.html"); 
    response = request.GetResponse(); 
    dataStream = response.GetResponseStream(); 
    reader = new StreamReader(dataStream); 
    responseFromServer = reader.ReadToEnd(); 
    /*secret code :P */ 
    reader.Close(); 
    dataStream.Close(); 
    response.Close(); 
} 

所以,這是我的代碼...第一個webrequest登錄到網站。它在瀏覽器中正常工作,如果登錄不正確,則返回1。然後第二個是對同一網站的網頁的正常web請求。但是登錄已經消失了,我得到的迴應是我如果沒有登錄就會得到的迴應!有人可以告訴我我做錯了什麼嗎?我如何保持它活着?我必須使用無形的webbroswer控件或類似的東西嗎?C#:如何登錄並保持其有效並創建另一個webrequest?

回答

2

@ liho1eye是正確的。以下是來自HttpWebRequest頁面的更多信息:

出於安全原因,默認情況下,Cookie是 已禁用。如果您想要 使用Cookie,請使用CookieContainer 屬性啓用Cookie。

您需要引用HttpWebResponse.Cookies屬性來獲取初始會話令牌cookie。

編輯:

這裏做一個頁面的請求,並轉移響應餅乾到下一個請求的快速和骯髒的樣品。沒有做太多的測試或驗證(所以要小心!) - 只是爲了讓你知道這個方法。

 //this only has login/password info, you may need other parameters to trigger the appropriate action: 
     const string Parameters = "Login1$username=pfadmin&Login1$Password=password"; 

     System.Net.HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create("http://[WebApp]/Login.aspx"); 

     req.Method = "GET"; 
     req.CookieContainer = new CookieContainer(); 
     System.Net.HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

     //Create POST request and transfer session cookies from initial request 
     req = (HttpWebRequest)System.Net.WebRequest.Create("http://localhost/AdminWeb/Login.aspx"); 
     req.CookieContainer = new CookieContainer(); 
     foreach (Cookie c in resp.Cookies) 
     { 
      req.CookieContainer.Add(c); 
     } 
     req.ContentType = "application/x-www-form-urlencoded"; 
     //...continue on with your form POST 
+0

感謝您的回答!我啓用了cookies,但仍然無法使用它...可能是什麼問題?請你可以幫我一些代碼,謝謝。 :) – rainshark 2011-06-17 09:04:27

+0

恐怕我不能給你一個可以工作的通用代碼片段,因爲你與服務器的交互將取決於服務器如何處理請求。例如,您正在打一個PHP頁面,這可能會允許登錄/密碼參數作爲GET請求傳遞給查詢字符串。在ASP.Net頁面中,如果登錄代碼由按鈕單擊事件處理程序觸發,則可能需要發出GET請求並解析VIEWSTATE元素,然後以POST方式發送適當的參數以確保該頁面是回發並且觸發適當的發泄。你可以看到它變得非常具體... – mtazva 2011-06-17 15:27:30

+0

哦,我的親愛的神!我愛你!有用!非常感謝!! * HUG HUG HUG * – rainshark 2011-06-17 18:21:35

3

這與「保持活力」無關。 您需要在請求之間保留會話cookie。爲此,您首先需要爲您的登錄請求啓用Cookie(請參閱HttpWebRequest文檔 - 這有點不明顯)。然後,您需要將該cookie與所有以下任務一起傳遞。

也請利用的using()

+0

+1僅用於「使用」請求:) – mtazva 2011-06-16 20:09:11

+0

非常感謝您的回答!所以我嘗試使用這樣的CookieContainer: 'request.CookieContainer = new CookieContainer();' 但它仍然無法工作...請幫助我嗎? 當我通過網絡瀏覽器訪問時,我看到只有一個cookie而不是3個。順便說一句,告訴我什麼'使用()'是:) 再次感謝! – rainshark 2011-06-17 08:59:11

+0

只需爲您的請求啓用Cookie即可。您需要爲每個新請求傳遞第一個響應的CookieContainer的內容。 mtazva向你展示了一個如何去做的例子。 using()是一個C#語句,它自動將給定對象放置在其作用域的末尾。在這裏閱讀更多http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx。作爲拇指規則,實例化IDisposable的每個對象應始終使用()語句包裝。 – 2011-06-17 16:57:33

相關問題