Я создаю настольное приложение WPF 3.5 с собственной службой WCF.
Служба имеет конечную точку PollingDuplexHttpBinding, определенную следующим образом:
public static void StartService()
{
var selfHost = new ServiceHost(Singleton, new Uri("http://localhost:1155/"));
selfHost.AddServiceEndpoint(
typeof(IMyService),
new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll) {ReceiveTimeout = new TimeSpan(1,0,0,0)},
"MyService"
);
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
selfHost.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
selfHost.Open();
}
Примечание: IPolicyRetriever - это служба, которая позволяет мне определять файл политики
Это работает, и я вижу свой сервис в моем клиентском приложении Silverlight. Затем я создаю ссылку на прокси в коде Silverlight так:
EndpointAddress address = new EndpointAddress("http://localhost:1155/MyService");
PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll);
binding.ReceiveTimeout = new TimeSpan(1, 0, 0, 0);
_proxy = new MyServiceClient(binding, address);
_proxy.ReceiveReceived += MessageFromServer;
_proxy.OrderAsync("Test", 4);
И это тоже отлично работает, связь работает!
Но если я оставлю это в покое (то есть не отправляю сообщения с сервера) на более чем 1 минуту, а затем попытаюсь отправить сообщение клиенту из приложения сервера WPF, я получаю ошибки тайм-аута, например:
Превышен тайм-аут канала IOutputChannel при попытке отправки после 00:01:00. Увеличьте значение тайм-аута, передаваемое вызову Send, или увеличьте значение SendTimeout в Binding. Время, отведенное для этой операции, могло быть частью более длительного времени ожидания.
Все это работает на локальном хосте, и действительно не должно быть задержки, не говоря уже о задержке в 1 минуту. Я не знаю почему, но канал, похоже, закрыт или потерян или что-то в этом роде ...
Я также попытался удалить тайм-ауты на привязках, и я получаю ошибки, подобные этой
Объект связи System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, поскольку он был прерван
Как я могу попытаться выяснить, что здесь не так?