在异步web请求中设置请求属性失败。C#

在异步web请求中设置请求属性失败。C#,c#,asynchronous,properties,request,set,C#,Asynchronous,Properties,Request,Set,下面是调用on button click事件的方法 private void LoginButton_Click(object sender, EventArgs e) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl); IAsyncResult result = request.BeginGetResponse( new

下面是调用on button click事件的方法

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);
    }
}
问题是,当我用fiddler检查时,我只能看到以下标题属性

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

也就是说,我只知道如何为普通请求设置属性。

您试图在响应可用时设置请求的属性。在向服务器发出请求之前,您需要设置请求属性,因此您应该在
登录按钮中单击
,而不是在响应处理代码中设置它们。同样,您不能在
BeginGetResponse
的回调中使用
GetRequestStream
。粗略地说,你想要:

  • 在初始事件处理程序中:
    • 创建请求
    • 设置简单属性
    • 调用
      BeginGetRequestStream
  • BeginGetRequestStream的回调处理程序中
    
    • 写出身体数据
    • 调用
      BeginGetResponse
  • BeginGetResponse
    • 处理响应数据

或者,除非您必须使用异步调用,否则您可以只创建一个单独的线程,而使用同步版本。在C#5语言支持之前,这会更简单。

如果您尝试查看MSDN站点,您会发现这一点吗?如果您需要设置标题,您可以通过header属性进行设置:我的工作假设是SMS提供商有相应的措施来防止用户自动发送SMS垃圾邮件。请与您的提供商联系以获得支持。@HansPassant-我已经成功地收到了正在工作的非异步请求。所以没问题。我在程序中使用了这种方法。但获取的对象引用未设置为对象的实例。在postStream.write方法中。我在任何地方都没有使用null。什么可能导致问题?编辑:我只是在RequestStreamCallBack方法中实例化postData。很好。谢谢你。
 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
        }
        }