HttpWebRequest 在第一次失败后总是失败

Posted

技术标签:

【中文标题】HttpWebRequest 在第一次失败后总是失败【英文标题】:HttpWebRequest always fails after first fail 【发布时间】:2018-08-14 09:07:09 【问题描述】:

这是我的问题:我的 winform 会定期检查第三方网络服务以获取一些数据。

只要没有网络问题,一切正常......但是一旦我遇到一个(*** 关闭,质量差等......),我的应用程序就无法联系网络服务(得到一个

“无法连接到远程服务器”

每次,后跟一个

SocketException:“连接尝试失败,因为已连接 当事人在一段时间后没有正确回应,或建立 连接失败,因为连接的主机没有响应”)。

我不得不重新启动我的应用程序以使其再次运行...

我猜这是关闭连接或其他什么的问题,但是......无论我尝试什么(WebRequestHttpWebRequest,关闭响应流......),结果都是一样的...... 这是我当前的代码

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Credentials = new NetworkCredential(strIdCredential, strPasswordCredential);
try

   string strReturnValue = "";
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   
      using (Stream data = response.GetResponseStream())
      
         using (StreamReader sr = new StreamReader(data))
         
            strReturnValue = sr.ReadToEnd();
         
         response.GetResponseStream().Close();
      
    
   return strReturnValue;

catch (WebException e)

   using(var response = e.Response)
   
      if (response != null)
        response.GetResponseStream().Close();
   
   return cstrNetworkError;

我做错了吗?它是来自网络服务的安全性吗?

【问题讨论】:

您是否尝试用using(...) 包裹request?像这样:using (var request = WebRequest.Create(strUrl) as HttpWebRequest) ... 使用 cmd.exe >Netstat -a 确定客户端和服务器上的连接是否仍然打开。我不喜欢 using 语句,因为它自己处理异常。我宁愿有一个 try/catch 来捕捉异常。在异常句柄中,您可以添加应该解决问题的 Close() 方法。现在,当发生异常时,您不执行 Close()。 【参考方案1】:

我看不出代码有什么问题,只是清理代码可能什么也没做。在您调用response.GetResponseStream().Close() 时,StreamReader 已经被放置在其封闭的using 块的末尾,这反过来将关闭流。 catch 块中的清理代码也是无用的,它可能会抛出未处理的异常。

我知道这并不能解决您的问题,但从您提供的代码来看,问题并不明显。我可能会建议尝试通过在每次调用时添加具有不同值的查询参数来避免任何可能的错误缓存,以防 Web 服务足以忽略它。

【讨论】:

以上是关于HttpWebRequest 在第一次失败后总是失败的主要内容,如果未能解决你的问题,请参考以下文章

当 Qt-5 连接失败时

HttpWebRequest在GetResponse时总是超时

强制 HttpWebRequest 和 ClientWebSocket 使用 TLS 1.2

HttpWebRequest模拟登陆页面,已登陆成功,但是用WebClient抓取主页面时,总是提示操作超时

HttpWebrequest 身份验证失败,因为无法重用连接

jdk安装总是失败,这是怎么回事