Как вызвать одноэлементную службу WCF в одноэлементной службе WCF без зависания? - PullRequest
0 голосов
/ 13 апреля 2010

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

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

Услуга односторонней связи - Fire & Forget вид вызова, она не возвращает никакого значения.

0 голосов
/ 14 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...