【发布时间】:2011-06-25 20:51:12
【问题描述】:
我们最近发现 WCF 不支持服务端的超时操作(注意,service 端,而不是客户端)。虽然客户端在指定时间后断开,但我们的测试表明,对于 netNamedPipeBinding、netTcpBinding 和 basicHttpBinding,我们指定的没有超时将导致服务操作在被调用后停止。以下是我们尝试的具体绑定配置:
<bindings>
<netNamedPipeBinding>
<binding name="TestServiceBindingConfigurationNamedPipe"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</netNamedPipeBinding>
<netTcpBinding>
<binding name="TestServiceBindingConfigurationTcp"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</netTcpBinding>
<basicHttpBinding>
<binding name="TestServiceBindingConfigurationBasicHttp"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</basicHttpBinding>
</bindings>
我们的测试服务实现如下所示:
public class TestServiceImpl : ITestService
{
public TestResult TestIt(TestArgs args)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
// this is a contrived example, but it shows that WCF never stops this thread
while (true)
{
Console.WriteLine("{0}> I'm running forever...", stopwatch.Elapsed);
}
return new TestResult {Result = "Args were " + args.Args};
}
}
使用 netNamedPipeBinding 和 netTcpBinding,我们的客户端应用会在 5 秒后超时,但服务会无限期地继续运行。
这带来了我的问题——这是一个错误吗?如果服务运行时间超过预期,WCF 是否不想让服务超时?
在我看来,与此相关的一些潜在负面问题包括:
- 服务实例的默认限制是10个。因此,如果您的服务中有坏代码永远运行并且被命中10次,您的服务将完全关闭;不接受新的连接。
- 对于服务永远运行这一事实没有任何可见性 - 缺少自定义日志记录或可能使用性能计数器
- 如果没有其他机制使操作超时,则服务调用正在使用的任何资源(例如 SQL 行、页和表锁)都可能被无限期保留。
【问题讨论】: