C# 尽管有绑定超时设置,WCF仍不稳定地超时

C# 尽管有绑定超时设置,WCF仍不稳定地超时,c#,timeout,wcf-binding,C#,Timeout,Wcf Binding,我的系统由一组WCF服务组成,可供各种客户端使用。 我要做的第一件事是以交互模式运行服务(我有一个控制台弹出,让我知道服务已启动)。 然后,我可以运行一个给定的客户端来执行我的任何WCF服务。实例化后,客户端将按以下方式创建通道和相关超时: var ctx = new InstanceContext(TestCallbackProxy.Instance); string baseAddress = Constants.ServiceBaseAddress; var binding = new

我的系统由一组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;

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

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秒后死亡

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();