Недавно мы обнаружили, что WCF не поддерживает операции тайм-аута на стороне службы (примечание: служба сторона, а не сторона клиента). В то время как клиент отключается по истечении указанного времени, наше тестирование показало, что для netNamedPipeBinding, netTcpBinding и basicHttpBinding ни одно из указанных нами тайм-аутов не приведет к остановке работы службы после ее вызова. Ниже приведены конкретные конфигурации привязок, которые мы попробовали:
<bindings>
<netNamedPipeBinding>
<binding name="TestServiceBindingConfigurationNamedPipe"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</netNamedPipeBinding>
<netTcpBinding>
<binding name="TestServiceBindingConfigurationTcp"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</netTcpBinding>
<basicHttpBinding>
<binding name="TestServiceBindingConfigurationBasicHttp"
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
closeTimeout="00:00:05"
openTimeout="00:00:05" />
</basicHttpBinding>
</bindings>
Наша реализация службы тестирования выглядит следующим образом:
public class TestServiceImpl : ITestService
{
public TestResult TestIt(TestArgs args)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
// this is a contrived example, but it shows that WCF never stops this thread
while (true)
{
Console.WriteLine("{0}> I'm running forever...", stopwatch.Elapsed);
}
return new TestResult {Result = "Args were " + args.Args};
}
}
Используя netNamedPipeBinding и netTcpBinding, наше клиентское приложение будет отключено через 5 секунд, но служба будет продолжать работать неопределенно долго.
Это вызывает у меня вопрос (ы) - это ошибка? Есть ли какая-то конкретная причина, по которой WCF не захочет использовать службы с тайм-аутом, если они работают дольше, чем ожидалось?
С моей точки зрения, некоторые из возможных негативных проблем с этим включают:
- Лимит по умолчанию для экземпляров службы по умолчанию равен 10. Поэтому, если у вас в сервисе плохой код, который работает вечно и его 10 раз ударили, ваша служба будет полностью закрыта; новые подключения не принимаются.
- Нет никакого представления о том, что сервисы работают вечно - не считая пользовательских журналов или, возможно, с использованием счетчиков производительности
- Любые ресурсы, используемые служебным вызовом, могут храниться неопределенно долго (например, блокировки строк, страниц и таблиц SQL), если нет других механизмов для тайм-аута операции.