Время ожидания WCF ошибочно, несмотря на настройки времени ожидания привязки - PullRequest
1 голос
/ 19 февраля 2020

Моя система состоит из набора служб 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 с c? Используемые таймауты:

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

1 Ответ

1 голос
/ 19 февраля 2020

Я думаю, причина в том, что вы должны устанавливать таймауты на стороне обслуживания, где вы настраиваете свои хосты и определяете конечные точки, а не на стороне клиента. Вот пример:

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 с c.

...