Использование WCF и NetNamedPipeBinding для IPC - PullRequest
2 голосов
/ 08 октября 2010

Я пытаюсь научить WCF использовать его в качестве механизма IPC для системы хост / плагин. Хост должен иметь возможность вызывать плагин для запуска / остановки его, а плагин должен вызывать сервер обратно для выполнения регистрации.

Я сделал простой тестовый случай, когда хост создает конечную точку на net.pipe://localhost/SampleServer со следующим ServiceContract:

[ServiceContract]
public interface IWcfServer
{
    [OperationContract]
    void Log(string message);
}

И плагин создает конечную точку на net.pipe://localhost/SampleClient со следующим ServiceContract:

[ServiceContract]
public interface IWcfClient
{
    [OperationContract]
    string Init();
}

Вот пример того, как я настраиваю каждую конечную точку:

this.server = new ServiceHost(this);
this.server.AddServiceEndpoint(typeof(IWcfServer), 
                               new NetNamedPipeBinding(), 
                               "net.pipe://localhost/SampleServer");
this.server.Open();

А вот пример того, как я звоню:

ChannelFactory<IWcfClient> factory = new ChannelFactory<IWcfClient>(
                            new NetNamedPipeBinding(),
                            new EndpointAddress("net.pipe://localhost/SampleClient"));
IWcfClient client = factory.CreateChannel();
using ((IClientChannel)client)
{
    client.Init());
}

Я уже подтвердил, что хост может звонить plugin.Init(), а плагин может вызывать host.Log(message) без проблем. Однако, если происходит следующий сценарий:

  1. Хост звонит плагину. Init ()
  2. Во время выполнения plugin.Init () плагин пытается вызвать host.Log (message)

Приложения зависают, и я получаю TimeoutException через 1 минуту. У кого-нибудь есть идеи, что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 20 октября 2010

Что такое InstanceContextMode узла службы?Если это одиночный код, он будет блокироваться до тех пор, пока не будет возвращен Init (), что приведет к циклической зависимости.

0 голосов
/ 22 декабря 2010

"net.pipe: // локальный / SampleServer" "Net.pipe: // локальный / SampleClient" У вас есть два разных URL для Сервера и для Клиента. Это проблема!

0 голосов
/ 10 октября 2010

Включите трассировку E2E для WCF, чтобы проверить, какой именно тайм-аут.- http://msdn.microsoft.com/en-us/library/ms733025.aspx. Кроме того, ваши методы могут вызывать взаимоблокировку, поскольку init может потребовать журнал, а log может потребоваться, чтобы init происходил первым или что-то в этом роде.

0 голосов
/ 09 октября 2010

1 мин - стандартное время ожидания wcf.

У вас есть круговая ссылка?

Кроме того, почему у вас есть 2 контракта, когда вы звоните в client.init, который слушает?

...