在异步web请求中设置请求属性失败。C#
下面是调用on button click事件的方法在异步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
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
}
}