【问题标题】:How to handle an interrupted HTTP connection in C#如何在 C# 中处理中断的 HTTP 连接
【发布时间】:2012-05-21 20:17:36
【问题描述】:

假设我创建了一个HTTPWebRequest,调用它的GetResponse() 并开始从响应流中读取。如果在从流中读取时连接中断,我是否必须等待它超时,或者我可以立即知道出了什么问题?当我中断连接时不会抛出异常(例如,我将计算机与网络断开连接)。

【问题讨论】:

    标签: c# httpwebrequest connection request


    【解决方案1】:

    视情况而定。

    一般来说,您需要为这两种情况(立即中断和后期中断)做好准备。 例如,如果服务器断开了您的连接,您会相对较快地知道。

    请参阅 http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus 了解可能发生的错误类型(WebRequest 类在错误时抛出 WebExceptions)

    您有多种选择:

    • 使用异步方法(BeginGet...EndGet...)并以此为基础建模您的应用程序。基本上,如果成功或错误,您会“在某个时候”收到通知。在此期间做点别的事情
    • 如果您想要绝对控制,您可以在获取的流上指定ReadTimeout(参见其他答案的评论,同时在请求中设置Timeout)。重试什么的。
    • 等一下

    【讨论】:

      【解决方案2】:

      您不必担心请求是否被中断。

      您可以如下指定显式超时。 如果它被打断,你会得到异常。

           try
           {
              var request = HttpWebRequest.Create(url);
              request.Timeout = 3000;
              var response = request.GetResponse() as HttpWebResponse;
              if (response.StatusCode.Equals(HttpStatusCode.OK))
              {
                 //do stuff
              }
           }
           catch (Exception exception)
           {
              exception.ToLog();
           }
      

      【讨论】:

      • 超时不包括在获得响应流 afaik 后发生的情况。所以你在读取响应流时仍然可以超时
      • 我正在使用这个(改为更改stream.ReadTimeout),但显然我不能限制太多,否则它很容易超时。
      【解决方案3】:

      很可能你必须等待超时

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 2016-02-25
        相关资源
        最近更新 更多