我使用HttpWebRequest访问Http请求,使用异步方法时无响应
public async Task<string> PostAsync(string url, string postData, Hashtable headht = null)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json;charset=UTF-8";
request.Accept = "application/json";
request.Timeout = 10000;
#region headers设置
if (headht != null)
{
foreach (DictionaryEntry item in headht)
{
request.Headers.Add(item.Key.ToString(), item.Value.ToString());
}
}
#endregion
byte[] paramJsonBytes;
paramJsonBytes = System.Text.Encoding.UTF8.GetBytes(postData);
request.ContentLength = paramJsonBytes.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(paramJsonBytes, 0, paramJsonBytes.Length);
reqStream.Close();
}
var response = request.GetResponseAsync() as HttpWebResponse;
Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
string text = reader.ReadToEnd();
return text;
}
但是我将异步改成同步就没有这个问题
var response = request.GetResponse() as HttpWebResponse;
这需要怎么解决
异步方式的返回,不是通过这种方式获取。因为是异步,结果不会马上给你,给你的只是一个响应,告诉你调用成功了。至于收到结果的时间,取决于这个异步方法后端的执行时间,真实结果的获取方式也取决于所异步的具体实现,查看相关的手册。
对于异步请求无响应的情况,可能的原因有以下几种:
针对以上原因,我们可以分别采取以下措施:
var request = WebRequest.Create(url) as HttpWebRequest;
// 设置请求超时时间
request.Timeout = 5000;
var task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
task.ContinueWith(t =>
{
var response = t.Result as HttpWebResponse;
if (response.StatusCode == HttpStatusCode.OK)
{
// 处理响应信息
}
else
{
// 处理异常信息
}
});
var response = request.GetResponse() as HttpWebResponse;
if (response.StatusCode == HttpStatusCode.OK)
{
// 处理响应信息
}
else
{
// 处理异常信息
}
总之,针对异步请求无响应的问题,我们需要对可能的原因进行仔细排查,并采取相应的措施解决问题。