WCF несколько приложений с использованием NetNamedPipe - PullRequest
9 голосов
/ 16 марта 2011

Я пытаюсь запустить несколько приложений, размещающих службы WCF, на одном компьютере.

Я хочу запустить несколько приложений , а не несколько служб в одном приложении.

Я изменяю «FOO» для каждого приложения, но все равно не могу запустить несколько Сервисов.Думаю, это довольно просто, но я застрял: (

С уважением

Ответы [ 2 ]

8 голосов
/ 17 марта 2011

Подходя к нему так, вы получите то, что хотите, я считаю:

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, который изменяется при каждом открытии службы,То, что является , полученным из адреса службы, является именем объекта общей памяти, через который фактическое имя канала публикуется для потенциальных клиентов. Подробнее см. Здесь.

0 голосов
/ 16 марта 2011

Если вам нужно создать сервисные хосты для разных сервисных контрактов, как показано здесь:

...    
host1 = new SeviceHost(typeof(MyClass1, ...);
host2 = new ServiceHost(typeof(MyClass2, ...);
...

тогда вам нужно использовать разные базовые адреса для каждого нового ServiceHost, как предполагает ответ Мэтью. Если все ваши сервисные хосты относятся к одному и тому же типу (MyClass1), вам может потребоваться создать несколько конечных точек для этой же службы. Каждая конечная точка может быть для другого интерфейса (например, ISomeInterface1, ISomeInterface2, ...) в этой службе.

...