Я пытаюсь изучить WCF, чтобы использовать его в качестве механизма IPC для системы хоста/плагина. Хост должен иметь возможность вызвать плагин, чтобы запустить/остановить его, и плагин должен вызвать сервер обратно для ведения журнала.Использование WCF и NetNamedPipeBinding для 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)
без проблем. Однако, если это произойдет следующий сценарий:
- Хост называет plugin.Init()
- Во время исполнения plugin.Init(), плагин пытается вызвать host.Log (сообщение)
Приложения замораживаются, и я получаю TimeoutException
через 1 мин. У кого-нибудь есть идеи о том, что я делаю неправильно?
FYI «IsOneWay» в '' void'-возвращающем 'Log()' может помочь избежать блокировки '[OperationContract (IsOneWay = true)]' - см. Http://msdn.microsoft.com/en-us/ library/system.servicemodel.operationcontractattribute.isoneway.aspx, как описано в http://dotnet-experience.blogspot.com/2012/02/inter-process-duplex-communication-with.html – ToolmakerSteve