WCF несколько приложений с использованием NetNamedPipe
Я пытаюсь запустить несколько приложений хостинга WCF на одном компьютере.
Я хочу запустить несколько приложений, а не несколько служб в одном приложении.
var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISomeInterface), new NetNamedPipeBinding(), "FOO");
host.Open();
Я изменяю "FOO" для каждого приложения, но все равно не могу запустить несколько служб. Думаю, это довольно просто, но я застрял:(
С уважением
2 ответа
Подходя к этому так, я сделаю то, что вы хотите, я считаю:
string relativeUriPart = GetUniquePartFromConfigOfThisApplicationInstance();
var host = new ServiceHost(typeof(MyClass1)); // No base addresses specified
host.AddServiceEndpoint(
typeof(ISomeInterface),
new NetNamedPipeBinding(),
"net.pipe://localhost/" + relativeUriPart); // Specify absolute URI for endpoint
host.Open();
Это потому, что если вы укажете базовый адрес, который использует net.pipe
Схема, именно этот базовый адрес используется для получения имени канала, используемого слушателем [см. правку ниже], и это то же самое в каждом экземпляре приложения, так что только слушатель первого приложения может создать канал - другие терпят неудачу как Вы заметили.
Используя абсолютный URI на уровне конечной точки, без базового адреса, слушатель создается с именем канала, полученным [см. Правку ниже] из полного абсолютного URI, который отличается в каждом экземпляре приложения, и поэтому слушатель каждого приложения может создать свой собственные отличные трубы без проблем.
РЕДАКТИРОВАТЬ: Чтобы быть более точным, само имя канала не является производным от адреса службы вообще - это GUID, который изменяется при каждом открытии службы. Из адреса службы выводится имя объекта общей памяти, через который фактическое имя канала публикуется для потенциальных клиентов. Смотрите здесь для более подробной информации.
Если вам нужно создать сервисные хосты для разных сервисных контрактов, как показано здесь:
...
host1 = new SeviceHost(typeof(MyClass1, ...);
host2 = new ServiceHost(typeof(MyClass2, ...);
...
тогда вам нужно использовать разные базовые адреса для каждого нового ServiceHost, как предполагает ответ Мэтью. Если все ваши сервисные хосты относятся к одному и тому же типу (MyClass1), вам может потребоваться создать несколько конечных точек для одной и той же службы. Каждая конечная точка может быть для другого интерфейса (то есть ISomeInterface1, ISomeInterface2, ...) в этой службе.