2011-12-26 96 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