Вопрос по publish-subscribe, callback, .net, wcf – Делать обратные вызовы WCF TimeOut
Я написал систему, которая использует дуплексный канал NetTcp с обратным вызовом для функционирования в качестве сервера публикации / подписки.
Должен ли я беспокоиться о тайм-ауте обратного вызова, если через некоторое время соединение не отправляется или канал обратного вызова будет поддерживаться бесконечно?
он будет искать значения тайм-аута, которые вы установили в своей конфигурации. Если вы включаете надежные сеансы, вы можете установить таймауты неактивности ваших клиентов. Вы можете настроить время ожидания следующим образом:
<netTcpBinding>
<binding
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
transactionFlow="false"
......>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
</binding>
</netTcpBinding>
Когда эти значения достигнуты, а ответ по-прежнему отсутствует, ваш канал связи выходит из строя, и вам необходимо заново создать клиентский прокси-сервер для использования службы. Значение по умолчанию дляreceiveTimeout
10 минут, так что вы можете увеличить это, но и обязательно увеличитьinactivityTimeout
а вашinactivityTimeout
должно быть больше, чем вашreceiveTimeout
.
EDIT:
Вы могли бы продолжать менять свойreceiveTimeout
программно на основе значений, которые ваш клиент отправляет обратно на сервер, ключnew значения времени ожидания одинаковы для службы и клиента.
Вы можете сделать это на клиенте (пример, который я беру из службы чата, которую я создаю с помощью WCF и использую с клиентами Silverlight):
//Create different clients dynamically
MyChatServiceClient _client1 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_1");
MyChatServiceClient _client2 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_2");
В конфигурации клиента:
<!--In your config file, define multiple endpoints/behaviors with different values based on your needs-->
<bindings>
<customBinding>
<binding name="NetTcpBinding_IMyChatService_1" receiveTimeout="00:01:00" ...>
<binaryMessageEncoding />
<tcpTransport maxReceivedMessageSize="283647" maxBufferSize="283647" />
</binding>
<binding name="NetTcpBinding_IMyChatService_2" receiveTimeout="00:22:00" ...>
<binaryMessageEncoding />
<tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.1.51:4520/VideoChatServer/"
binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_1"
contract="IMyChatService" name="NetTcpBinding_IMyChatService_1" />
<endpoint address="net.tcp://192.168.1.51:4522/VideoChatServer/"
binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_2"
contract="IMyChatService" name="NetTcpBinding_IMyChatService_2" />
</client>
Таким образом, вы можете определить несколько конечных точек или привязок в конфигурации на вашем клиенте или сервере, а затем на основе любого событие в вашем приложении, вы можете создать экземпляр _clientProxyX для использования _serviceInstanceX, который будет иметь различные значения привязки / конечной точки но тот же контракт, что и вашprevious экземпляр службы. В приведенном выше примере время первой привязки составляет 1 минуту, вторая привязка 2 минуты. Важным моментом, который следует учитывать, является то, что если вы хотите воссоздать новые клиентские прокси-серверы, как это, то вам нужно демонтировать старый клиент прокси и ящик новый, который эффективно отключает ваших клиентов от службы, по крайней мере, на мгновение.
Также вы можете изменить эти значения (openTimeout
, closeTimeout
и т.д.) программно на обоих серверах при создании нового хоста службы.
Вы можете создать новый хост на основе одной из конфигураций привязки, которые вы определили в вашей конфигурации,
или создайте новый конфиг программно, что-то вроде этого:
var host = new ServiceHost(typeof(MyChatService));
var webHttpBinding = new System.ServiceModel.WebHttpBinding();
//Modify new timeout values before starting the host
webHttpBinding.OpenTimeout = new TimeSpan(1, 0, 0);
webHttpBinding.CloseTimeout = new TimeSpan(1, 0, 0);
host.AddServiceEndpoint(webHttpBinding, "http://192.168.1.51/myService.svc");
//start the host after necessary adjustments
host.Open();
Я знаю, что это выглядит довольно грязно, но дело в том, что WCF дает вам большую гибкость, позволяя программно изменять настройки привязки. Не забудьте проверитьэтот отличный ответ на изменение ваших файлов конфигурации WCF. И вы также можете легко создать целоенастройка сервиса программно.