2011-12-26 159 views
2
private void LoginButton_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl); 
     IAsyncResult result = request.BeginGetResponse(
      new AsyncCallback(DeleResponse), request); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

在此可以叫上按鈕單擊事件在異步Web請求中設置請求屬性失敗。 C#

private void DeleResponse(IAsyncResult result) 
{ 
    byte[] PostData = Encoding.UTF8.GetBytes("username=" + userInp.Text + "&password=" + passInp.Text + extraLoginPostString); 
    LoginButton.Text = "Logging in..."; 
    LoginButton.Enabled = false; 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    request.Method = "Post"; 
    request.CookieContainer = authCookie; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.AllowAutoRedirect = false; 
    postWriter = request.GetRequestStream(); 
    postWriter.Write(PostData, 0, PostData.Length); 
    postWriter.Close(); 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 
     string serverData = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
    string loginValidateString = response.GetResponseHeader(loginValidateStringHolder); 
    if (loginValidateString.Contains(LoggedKeyword)) 
    { 
      some process here: 
     } 
     else if(FAILKEYWORDCHECK HERE) 
     { 
      login page process here; 
     } 
    } 

方法的問題是,當我檢查這個用小提琴手我只能看到下面的標題屬性。

Connection: Keep-Alive; 
Host: www.example.com 

什麼是我不能在請求頭中設置屬性的原因?

編輯:增加了我已經實現的同步請求方法,沒有任何錯誤。

private void LoginButton_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      LoginButton.Text = "Logging in..."; 
      LoginButton.Enabled = false; 
      byte[] PostData = Encoding.UTF8.GetBytes("username=" + userInp.Text + "&password=" + passInp.Text + extraLoginPostString); 
      request = (HttpWebRequest)WebRequest.Create(loginUrl); 
      request.Method = "Post"; 
      request.CookieContainer = authCookie; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.AllowAutoRedirect = false; 

      postWriter = request.GetRequestStream(); 
      postWriter.Write(PostData, 0, PostData.Length); 
      postWriter.Close(); 

      response = (HttpWebResponse)request.GetResponse(); 

      string serverData = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
      string loginValidateString = response.GetResponseHeader(loginValidateStringHolder); 
      if (loginValidateString.Contains(LoggedKeyword)) 
      { 
       MessageBox.Show("Logged in Successfully"); 

       foreach (Cookie cookieReader in response.Cookies) 
       { 
        authCookie.Add(cookieReader); 
       } 
       Success method continues.. 
      } 
      else if (loginValidateString.Contains(failedLogKeyword)) 
      { 
       Failed process 
      } 
     } 
     catch 
     { 
      Catchblock 
     } 
     } 

手段,我只是知道如何設置正常請求的屬性。

+0

請問這可以解決你嘗試查看MSDN網站http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest%28v=vs.95%29.aspx – MethodMan 2011-12-26 16:18:09

+0

究竟是什麼你試圖達到?如果你需要設置標題,你可以通過header屬性來完成它:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.headers.aspx – TheBoyan 2011-12-26 16:19:17

+0

我會假設SMS提供商已採取措施防止用戶自動發送短信垃圾郵件。聯繫您的提供商尋求支持。 – 2011-12-26 16:26:19

回答

3

響應可用時,您正試圖設置請求的屬性。在向服務器提出請求之前,您需要設置請求屬性 - 因此您應該將它們設置爲LoginButton_Click,而不是響應處理代碼。同樣,您不能在BeginGetResponse的回調中使用GetRequestStream。粗略地說,你想:

  • 在最初的事件處理程序:
    • 創建
    • 設置簡單的屬性
    • 呼叫BeginGetRequestStream
  • 在回調處理BeginGetRequestStream
      請求
    • 寫出身體數據
    • 呼叫BeginGetResponse
  • 在回調處理BeginGetResponse
    • 處理響應數據

或者,除非你使用異步調用,你可以只創建一個單獨的線程並使用同步版本。在C#5語言支持之前,這會更簡單。

+0

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest。begingetrequeststream.aspx我在我的程序中使用了這個方法。但是在postStream.write方法中得到**對象引用未設置爲對象的實例。我沒有在任何地方使用null。什麼可能會導致問題? – Jones 2012-01-04 18:28:49

+0

編輯:我只是在RequestStreamCallBack方法中實例化postData。工作正常。謝謝你。 – Jones 2012-01-04 18:38:52