Http 异步请求无响应

我使用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;
这需要怎么解决

异步方式的返回,不是通过这种方式获取。因为是异步,结果不会马上给你,给你的只是一个响应,告诉你调用成功了。至于收到结果的时间,取决于这个异步方法后端的执行时间,真实结果的获取方式也取决于所异步的具体实现,查看相关的手册。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/260514
  • 这篇博客也不错, 你可以看下处理HttpWebRequest访问https有安全证书的问题
  • 以下回答由chatgpt基于相关博客总结生成:

    对于异步请求无响应的情况,可能的原因有以下几种:

    1. 接收响应时出现异常,导致异步请求没有得到响应。
    2. 异步请求被服务端拒绝,例如服务端需要用户进行身份验证或者IP地址被限制等。
    3. 异步请求被网络拦截器拒绝,例如防火墙或者代理服务器设置不当等。

    针对以上原因,我们可以分别采取以下措施:

    1. 在异步请求中添加try-catch块,捕捉异常信息并进行处理。此外,我们可以使用Task类提供的ContinueWith方法处理异步操作的异常信息,具体步骤如下:
    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
        {
            // 处理异常信息
        }
    });
    
    1. 查看服务端返回的状态码,并根据状态码进行相应的处理:
    var response = request.GetResponse() as HttpWebResponse;
    if (response.StatusCode == HttpStatusCode.OK)
    {
        // 处理响应信息
    }
    else
    {
        // 处理异常信息
    }
    
    1. 检查网络拦截器的设置,例如防火墙、代理服务器等,确保异步请求不被拦截或者被正确地拦截。此外,我们可以尝试使用同步请求进行调试,以确定问题是否是由异步请求引起的。若此时同步请求也无法正常工作,则问题可能出在网络拦截器的设置上。

    总之,针对异步请求无响应的问题,我们需要对可能的原因进行仔细排查,并采取相应的措施解决问题。