我在同一服务器上调用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服务?
答案 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,参数和标题,具体来说:
! * ' ( ) ; : @ & = + $ , / ? # []
请注意,如果您想要从较长的长度发送数据,建议您在邮件正文中发送。