GetRequestStream随机抛出Timeout异常

时间:2010-02-12 15:17:23

标签: c# asp.net wcf httpwebrequest timeout

经过几天的谷歌搜索,我真的无法解决所描述的问题。希望在这里找到解决方案

我在同一服务器上调用WCF服务时使用附加代码。我在调用WebReq.GetRequestStream()

中随机获得Timeout错误

当我检查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秒的空闲时间之后抛出的,但也是在行中有5个左右的请求之后抛出的。真的找不到模式。

这段代码有什么问题?是否还有其他(更好)的方式来调用WCF服务?

4 个答案:

答案 0 :(得分:13)

我不知道它对这个问题负有明确的责任,但是如果它没有抛出异常,那么你只是关闭了web响应,并且你永远不会关闭响应流。使用using语句:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

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

答案 1 :(得分:6)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

要记住的第一件事是检查发送的URI,参数和标题,具体来说:

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

请注意,如果您想要从较长的长度发送数据,建议您在邮件正文中发送。