Я не использовал NetNamedPipes в WCF, но я потратил больше времени, чем мне было интересно узнать значения таймаута для NetTcp. Я использую следующие конфигурации для своих NetTcpBindings и имел удачу, когда соединение остается активным.
Сервер:
<binding name="MyBindingName" sendTimeout="00:00:30" receiveTimeout="infinite">
<reliableSession enabled="true" inactivityTimeout="00:05:00" ordered="true" />
<security mode="None" />
</binding>
Клиент:
<binding name="MyBindingName" closeTimeout="00:00:30" openTimeout="00:00:30" receiveTimeout="infinite" sendTimeout="00:00:30">
<reliableSession enabled="true" inactivityTimeout="00:01:00" ordered="true" />
<security mode="None" />
</binding>
важные параметры, которые я провел большую часть времени на это в SendTimeout и ReceiveTimeout. Если ваш getTimeout совпадает или меньше вашей отправки, канал будет падать после достижения этого таймаута. Если прием больше, а передача превышает пороговое значение, канал активирует keepalive уровня транспорта. Из моих тестов порог sendTimeout составляет 30 секунд. Что-то меньшее, чем это, и keepalives не отправляются.
Кроме того, у меня есть постоянный таймер, который я выполняю каждую минуту, чтобы убедиться, что канал работает и работает хорошо. Вызов просто к логическому возвратному элементу:
[OperationContract(IsOneWay = false, IsInitiating = false, IsTerminating = false)]
bool KeepAlive();
public bool KeepAlive()
{
return true;
}
Вы также можете захватить событие канала (если вы получаете их в нужное время) и снова открыть соединение, если что-то плохое:
InstanceContext site = new InstanceContext(this);
_proxy = new MyServiceChannel(site);
if (_proxy != null)
{
if (_proxy.Login())
{
//Login was successful
//Add channel event handlers so we can determine if something goes wrong
foreach (IChannel a in site.OutgoingChannels)
{
a.Opened += Channel_Opened;
a.Faulted += Channel_Faulted;
a.Closing += Channel_Closing;
a.Closed += Channel_Closed;
}
}
}
Надеюсь, что часть этого переводится и имеет ценность для вас с помощью NetNamedPipes.
Edit: Дополнительные параметры для захвата сервер перезапуска вопроса
Когда сервер перезагружается он должен вызвать канал клиента либо закрыть или неисправность. Захват этих событий на стороне клиента даст вам возможность использовать таймер повторного подключения до тех пор, пока услуга не будет доступна снова.
private void Channel_Faulted(object sender, EventArgs e)
{
IChannel channel = sender as IChannel;
if (channel != null)
{
channel.Abort();
channel.Close();
}
//Disable the keep alive timer now that the channel is faulted
_keepAliveTimer.Stop();
//The proxy channel should no longer be used
AbortProxy();
//Enable the try again timer and attempt to reconnect
_reconnectTimer.Start();
}
private void _reconnectTimer_Tick(object sender, System.EventArgs e)
{
if (_proxy == null)
{
InstanceContext site = new InstanceContext(this);
_proxy = new StateManagerClient(site);
}
if (_proxy != null)
{
if (_proxy.Login())
{
//The connection is back up
_reconnectTimer.Stop();
_keepAliveTimer.Start();
}
else
{
//The channel has likely faulted and the proxy should be destroyed
AbortProxy();
}
}
}
public void AbortProxy()
{
if (_proxy != null)
{
_proxy.Abort();
_proxy.Close();
_proxy = null;
}
}
Вы хотели бы обеспечить попытки входа переподключение таймера выполняются в фоновом потоке асинхронно, поэтому они не подвесить UI каждый раз, когда они пытаются войти в систему. YMMV
IIRC, второй последний параметр CreateNamedPipe (неуправляемая функция win32 под NamedPipeBinding - http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx) действует как таймаут соединения с клиентом, который довольно короткий ,Это может иметь какое-то отношение к таймауту, который вы видите при запуске сервера; возможно, вы можете использовать пользовательский рефлектор/dotpeek/отладчик, чтобы увидеть, какие параметры передаются из WCF в нативную функцию, и если эти параметры можно изменить с помощью конфигурации – 2013-01-24 13:40:45
Поскольку вопрос является академическим, в общем, я бы продолжил так: посмотрите, какие нативные функции вызываются, с какими тайм-аутами, а затем трассируются обратно туда, где эти функции вызывается из управляемого кода, чтобы увидеть, откуда возникли параметры. Долго, но весело и помогает вам разобраться, как это работает :) Я отлаживал проблему с Sharepoint таким образом ... – 2013-01-24 13:44:30