Как вызвать одноэлементную службу WCF в одноэлементной службе WCF без зависания?

У меня есть две службы, одна из которых вызывает другую. Оба помечены как синглтоны следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service : IService

И я настроил это с ServiceHost следующим образом:

ServiceHost serviceHost = new ServiceHost(singletonElement);
serviceHost.Open();

Когда родительская служба пытается вызвать дочернюю службу на том же компьютере, родительская служба зависает, ожидая дочернюю службу.

Я уже думаю об уходе от модели синглтона, но есть ли что-то не так с моим подходом? Есть ли объяснение этому поведению и выход из него?

2 ответа

Решение

Проблема заключалась в том, что я размещался в приложении WPF и не установил для UseSynchronizationContext значение false. Это делает хост службы WCF в потоке пользовательского интерфейса, таким образом вызывая взаимоблокировку, когда одна служба (в потоке пользовательского интерфейса) вызывает другую службу (также в потоке пользовательского интерфейса).

Родительская служба зависает, потому что может быть потому, что метод дочерней службы занимает слишком много времени. Если для возврата требуется много времени, вызовите его асинхронно или создайте дочерний метод servcie IsOneWayo=True в атрибуте OpearationContract.

Одним из способов обслуживания является вызов Fire & Forget, который не возвращает никакого значения.

Другие вопросы по тегам