C# GetRequestStream随机抛出超时异常
在谷歌搜索了几天后,我真的无法解决这个问题。希望这里能找到解决办法 我在同一台服务器上调用WCF服务时使用的是附加代码。我在call WebReq.GetRequestStream()中随机得到超时错误 当我检查netstat时,我看到连接仍然打开,所以可能有问题,但我不知道如何解决它C# GetRequestStream随机抛出超时异常,c#,asp.net,wcf,httpwebrequest,timeout,C#,Asp.net,Wcf,Httpwebrequest,Timeout,在谷歌搜索了几天后,我真的无法解决这个问题。希望这里能找到解决办法 我在同一台服务器上调用WCF服务时使用的是附加代码。我在call WebReq.GetRequestStream()中随机得到超时错误 当我检查netstat时,我看到连接仍然打开,所以可能有问题,但我不知道如何解决它 //request inicialization HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
//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服务的方法?我不知道这是否一定是问题的原因,但是只有在web响应没有抛出异常时,您才关闭web响应,并且您永远不会关闭响应流。使用
使用语句:
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd();
}
这可以很好地解释问题,因为如果您保持响应打开,它将保持与web服务器的连接打开-这意味着连接池将无法使用该连接。因为这是一种非常奇怪的行为,我想知道是否有其他方法调用托管在同一IIS服务器上的WCF服务。
我还有一件事,在没有真正优化的和所有其他方法中为此类调用创建TCP连接应该快得多。我也有同样的问题,添加一个调用似乎可以解决它。首先要记住的是查看URI、参数和发送的头,具体来说:
- 保留字符。发送URI可以带来的保留字符
问题
!*'( ) ; : @ & = + $ , / ? # []
- URI长度:不应超过2000个字符
- 长度头:大多数web服务器都会限制它们接受的头的大小。例如,在Apache中,默认限制为8KB
请记住,如果要发送较长长度的数据,建议在邮件正文中发送。这样会更好一些,但我仍然会超时。所以,这真的很奇怪。因此,在第一次链接后,点击是加载和加载,如果在这段时间内点击页面上的相同或任何其他链接,那么页面将在第二次左右加载。因此,连接创建有问题。我想我没有发现它在同一台机器上。。。我想知道你是否已经用完了线程池线程-这些线程在同一个进程中吗?我是.net编程的新手。我已经用PHP编程好几年了,从来没有注意到这样的问题。有些事情要容易得多。所以我不确定你说的“线程池外线程”是什么意思?使用一个请求,我创建了两个左右的对WCF服务的HTTP请求,所以它使用相同的进程/请求。我应该为这个请求使用缓存吗?@AnzeR:我相信WCF将为来自线程池的请求提供服务;如果您是从服务本身调用服务,那么如果没有更多的线程池线程可用,则可能会导致死锁。您还没有真正解释调用代码是什么-是在同一个服务中,还是在一个单独的应用程序中?嗯,我真的不熟悉所有这些IIS设置。WEB和WCF使用相同的应用程序池,它们位于同一站点,但设置为不同的应用程序谢谢!帮助我解决了我的问题。记住:始终正确关闭连接;)