Я пытаюсь научить 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)
без проблем. Однако, если происходит следующий сценарий:
- Хост звонит плагину. Init ()
- Во время выполнения plugin.Init () плагин пытается вызвать host.Log (message)
Приложения зависают, и я получаю TimeoutException
через 1 минуту. У кого-нибудь есть идеи, что я делаю не так?