尽管绑定了超时设置,WCF 还是不规律地超时
WCF erratically timing out despite binding timeout settings
我的系统由一堆可供各种客户端使用的 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。如果频道未使用,系统将简单地 vanish/be 丢弃 - 我相信与可重用性和优化有关。
然而,当试图证明这个理论并减少所有超时时,我无法让服务中断。 IE。当单独放置超过 30 秒时尝试使用该服务时,该服务不应该 timeout/break 吗?使用的超时是:
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);
我认为原因是您应该在服务端设置超时,而不是在客户端设置主机和定义端点。这是一个例子:
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 秒后停止运行。
我的系统由一堆可供各种客户端使用的 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。如果频道未使用,系统将简单地 vanish/be 丢弃 - 我相信与可重用性和优化有关。
然而,当试图证明这个理论并减少所有超时时,我无法让服务中断。 IE。当单独放置超过 30 秒时尝试使用该服务时,该服务不应该 timeout/break 吗?使用的超时是:
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);
我认为原因是您应该在服务端设置超时,而不是在客户端设置主机和定义端点。这是一个例子:
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 秒后停止运行。