我有一个WCF服务,有时必须返回一个错误.出于某种原因,对我的服务的调用开始超时,出现以下错误:
“请求通道在00:00:59.8906201之后等待回复时超时.增加传递给Request的调用的超时值或增加Binding上的SendTimeout值.分配给此操作的时间可能是一部分更长的超时.“
“请求通道在00:00:59.8906201之后等待回复时超时.增加传递给Request的调用的超时值或增加Binding上的SendTimeout值.分配给此操作的时间可能是一部分更长的超时.“
检查问题后,出现了一种模式:当服务10次返回故障时,超时开始.所以我创建了一个由以下实现的测试服务:
public string GetData(int value) { throw new FaultException("A testerror occured"); }
还有一个测试客户:
protected void RunTestGetData() { using (TestServiceReference.Service1Client client = new WSPerformanceTester.TestServiceReference.Service1Client()) { try { client.GetData(1); client.Close(); outputWriter.WriteLine(string.Format("Call run in thread {0}: GetData()",Thread.CurrentThread.ManagedThreadId)); outputWriter.Flush(); } catch (Exception e) { client.Abort(); client.Close(); outputWriter.WriteLine(string.Format("Error occured in thread {0}: GetData(): {1}",Thread.CurrentThread.ManagedThreadId,e.Message)); outputWriter.Flush(); } } }
只有在服务返回FaultException时才会发生这种情况.如果我抛出正常异常,服务可以在第10次调用后继续运行.显然,我想很好地包装我的异常,所以抛出正常异常并不是一个真正的选择.
为什么我会遇到这些超时异常?在此先感谢任何帮助..
解决方法
我没有足够的评论意见,所以新的回应……
自托管服务最多只允许10个并发连接 – 无论传输.如果你在IIS / WAS中运行WCF服务,你不必担心这个问题(除非你在最大并发连接数为10的XP / Vista上).
此方案中的故障异常和常规异常之间的差异可以说明您所看到的结果.
请记住,常规的未处理异常会使通道出错.这样做我认为这会打开一个可用的连接.当你返回一个故障时,它会“自动地对通道进行故障,因为它允许你对连接做一些事情并在你的末端处理故障,因为它是一个可能的”预期“故障,而未处理的异常则不会.
即使您返回故障,仍然需要Abort()连接.此外,下面还有非托管资源,因此请务必在客户端/代理的呼叫者上实现IDisposable.