首页 > 解决方案 > 尽管绑定超时设置,WCF 异常超时

问题描述

我的系统由一堆可供各种客户端使用的 WCF 服务组成。
我要做的第一件事是以交互模式运行服务(我有一个控制台弹出并让我知道服务已启动)。
然后我可以运行一个给定的客户端来执行我的任何 WCF 服务。实例化客户端时,通过以下方式创建通道和关联的超时:

var ctx = new InstanceContext(TestCallbackProxy.Instance);

string baseAddress = Constants.ServiceBaseAddress;

var binding = new NetNamedPipeBinding();
binding.MaxConnections = 10;
binding.OpenTimeout = System.TimeSpan.FromMinutes(1);
binding.CloseTimeout = System.TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(5);
binding.SendTimeout = System.TimeSpan.FromMinutes(5);

var channelFactory = new DuplexChannelFactory<ITestService>(ctx, binding, new EndpointAddress(baseAddress + serviceName));

 // Create channel to a specified endpoint
 _channel = channelFactory.CreateChannel() as ITestService;

现在,该服务最终会在一段时间未使用时超时,据我所知,这是可以预料的。IE。如果未使用,该通道将简单地消失/被系统丢弃-我相信这与可重用性和优化有关。
但是,当试图证明这一理论并减少所有超时时,我无法让服务中断。IE。在尝试使用服务超过 30 秒时,服务是否应该不会超时/中断?使用的超时是:

binding.OpenTimeout = System.TimeSpan.FromMinutes(0.5);
binding.CloseTimeout = System.TimeSpan.FromMinutes(0.5);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(0.5);
binding.SendTimeout = System.TimeSpan.FromMinutes(0.5);

标签: c#timeoutwcf-binding

解决方案


我认为原因是您应该在服务端设置超时,在服务端设置主机和定义端点,而不是在客户端。这是一个例子:

var binding = new NetNamedPipeBinding();
binding.MaxConnections = 10;
binding.OpenTimeout = TimeSpan.FromMinutes(0.5);
binding.CloseTimeout = TimeSpan.FromMinutes(0.5);
binding.ReceiveTimeout = TimeSpan.FromMinutes(0.5);
binding.SendTimeout = TimeSpan.FromMinutes(0.5);

// Compose URIs
Uri uriBase = new Uri(baseAddress);
Uri uri = new Uri(baseAddress + something);
Uri uriMex = new Uri(baseAddress + something + "/mex");

// Create End Points
SomeHost = new CustomServiceHost(typeof(TestService), uriBase);
SomeHost.AddServiceEndpoint(typeof(ITestService), binding, uri);
SomeHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, uriMex);

// Open the ServiceHost
SomeHost.Open();

现在你应该看到你的服务在 30 秒后死亡。


推荐阅读