GetRequestStream 随机抛出 Timeout 异常

Posted

技术标签:

【中文标题】GetRequestStream 随机抛出 Timeout 异常【英文标题】:GetRequestStream throws Timeout exception randomly 【发布时间】:2011-01-16 04:51:34 【问题描述】:

谷歌搜索了几天后,我真的无法解决所描述的问题。希望这里能找到解决办法

我在同一台服务器上调用 WCF 服务时使用了附加代码。我在调用 WebReq.GetRequestStream() 时随机收到超时错误

当我检查 netstat 时,我看到连接仍然打开,所以可能有问题,但我不知道如何解决它

       //request inicialization
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
        WebReq.Method = "POST";
        WebReq.ContentType = "application/json; charset=utf-8";
        WebReq.ContentLength = buffer.Length;

        WebReq.Proxy = null;
        WebReq.KeepAlive = false; //also tried with true
        WebReq.AllowWriteStreamBuffering = false; //also tried with true

        //this produces an error
        using (Stream PostData = WebReq.GetRequestStream())
        
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();
        

         //open and read response
         HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
         Stream Answer = WebResp.GetResponseStream();
         StreamReader _Answer = new StreamReader(Answer);

         WebResp.Close();

         //return string
         return _Answer.ReadToEnd();

超时主要是在大约 10 秒的空闲时间之后引发,但也会在连续五个左右的请求之后引发。实在找不到模式。

这段代码可能有什么问题?还有其他(更好的)调用 WCF 服务的方法吗?

【问题讨论】:

【参考方案1】:

我不知道它肯定是导致问题的原因,但是如果它没有引发异常,您只会关闭 Web 响应,并且您永远不会关闭响应流。使用using 语句:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))

    return reader.ReadToEnd();

这可以很好地解释问题,就像您打开响应一样,它将保持与 Web 服务器的连接打开 - 这意味着连接池将无法使用该连接。

【讨论】:

好一点,但我仍然遇到超时。所以,真的很奇怪。因此,在第一个链接点击之后是加载和加载,如果在那个时候点击页面上的相同或任何其他链接,那么页面会在第二个左右加载。所以连接创建有问题。我想 我没有发现它在同一台机器上......我想知道你是否用完了线程池线程 - 这些是否在同一个进程中? 我是 .net 编程的新手。用php编程已经有几年了,从来没有注意到这样的问题。有这件事要容易得多。所以我不确定“线程池线程外”是什么意思?通过一个请求,我向 WCF 服务创建了两个左右的 HTTP 请求,因此它具有相同的进程/请求。我应该对这个请求使用缓存吗? @AnzeR:我相信 WCF 会处理来自线程池的请求;如果您从自身调用服务,如果没有更多可用的线程池线程,您最终可能会陷入死锁。您还没有真正解释过调用代码是什么——它是在同一个服务中,还是在一个单独的应用程序中? 嗯,我真的不熟悉所有这些 IIS 设置。 WEB和WCF抵抗同一个Application Pool,它们在同一个Site中,但是设置为不同的Application【参考方案2】:

我遇到了同样的问题,添加对 HttpWebRequest.Abort() 的调用似乎可以解决它。

【讨论】:

谢谢!帮助我解决了我的问题。请记住:始终正确关闭您的连接;)【参考方案3】:

因为这确实是一种奇怪的行为,我想知道是否有任何其他方法可以调用托管在同一 IIS 服务器上的 WCF 服务。 我还认为,为这种调用创建 TCP 连接并没有真正优化,所有其他方法应该更快。

【讨论】:

【参考方案4】:

首先要记住的是查看正在发送的 URI、参数和标头,具体而言:

保留字符。通过URI发送保留字符可以带 问题! * ' ( ) ; : @ & = + $ , / ? # [] URI 长度:不应超过 2000 个字符 标头长度:大多数 Web 服务器都会限制它们接受的标头的大小。例如在 Apache 中默认限制是 8KB。

请记住,如果您想发送较长长度的数据,建议在消息正文中发送。

【讨论】:

以上是关于GetRequestStream 随机抛出 Timeout 异常的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebRequest.GetRequestStream() 超时

无法创建 SSL/TLS 安全通道 - GetRequestStream()

GetRequestStream 无法连接到服务器 目标计算机积极拒绝 127.0.0.1 1080

HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

转载HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

避免 HttpWebRequest GET 和 ProtocolViolationException