底层连接上的另一个线程已关闭。服务器关闭了预期保持活动状态的连接

时间:2013-12-18 03:09:51

标签: c# rest

我已经看到很多关于这个话题的主题......但谷歌上的解决方案对我不起作用。

我正在使用HttpWebRequest对象进行POST操作,当我尝试发布大量数据时出现错误

The underlying connection was closed. A connection that was expected to be kept alive was closed by the server

现在我用Google搜索,我找到了三个解决方案

  1. 设置KeepAlive = False并设置ProtocolVersion = HttpVersion10。
  2. 当我这样做时,没有错误......但不知怎的,我冒充的数据没有到达服务器。 (所以它以某种方式无声地失败......没有任何错误)。

    如果我删除KeepAlive = false并设置ProtocolVersion = HttpVersion10。然后我可以看到,对于小的请求,一切正常....但对于大的请求,我得到底层连接的错误已关闭。

    1. 我还发现有些人通过迁移到HttpClient而不是HttpWebRequest解决了这个问题...但我认为它仅适用于.NET 4.5,但我必须至少为.NET 3.5编译代码。

    2. 有些人通过

      解决了这个问题

      ServicePoint sp = ServicePointManager.FindServicePoint(request.RequestUri); sp.Expect100Continue = false;

    3. 再次,这没有错误。但数据没有提交。

      所以对我来说这些解决方案都不起作用。 你有什么想法吗?

      这是我的代码

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(completeUrl);
        request.CookieContainer = Utility.GetSSOCookie(completeUrl);
        request.Method = httpMethod;
        request.Timeout = int.MaxValue;
        Stream reqStream = null;
        string output = null;
        try {
            if (String.IsNullOrEmpty(input) == false) {
              byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(
                                  input
                              );
      
              request.ContentLength = buffer.Length;
              reqStream = request.GetRequestStream();
              reqStream.Write(buffer, 0, buffer.Length);
            }
          using (WebResponse response = request.GetResponse()) {
            using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
              output = reader.ReadToEnd();
            }
          }
        }
      

1 个答案:

答案 0 :(得分:0)

此例外可能具有误导性。

在c#httpclient与iis(v7)上的asp-mvc(v5)应用程序对话的情况下,我得到了相同的异常。之后我发现服务器在一个回弹循环中运行而没有抛出stackoverflow或任何日志。结果是服务器响应了对客户端的disconection。也许这可以帮助遇到这种错误的人。