2016-05-12 3 views
1

Я нахожусь в ситуации, когда я хочу использовать WCF, чтобы выставить два различных интерфейса:Различные услуги на разных портах WCF

  • Внутренний (IPC связи)
  • Внешняя (Http REST) ​​

Внешний интерфейс не должен видеть или использовать внутренний интерфейс, поэтому я думал о размещении двух служб на разных портах, например (8000 для внутренних и 8001 для внешних), а затем заблокировать всю внешнюю связь на порте 8000.

Кроме того, я пытался возиться с использованием именованных каналов для связи IPC, и у меня возникла проблема. Если возникает непредвиденная ситуация, что служба аварийно завершает работу или отключается, клиент также должен быть перезагружен, чтобы иметь возможность установить связь с сервисом через именованные каналы. Это нормальное поведение и его можно избежать?

У меня есть следующий код до сих пор:

// Service Host 
var host = new ServiceHost(serviceContract, new Uri(_address)); 
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true }); 
var behaviour = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behaviour.InstanceContextMode = InstanceContextMode.Single; 

// Local Endpoint 
host.AddServiceEndpoint(typeof(ILocalServiceContract), new BasicHttpBinding(), "Local"); 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 

// External Endpoint 
var webHttpBidning = new WebHttpBinding { TransferMode = TransferMode.Streamed }; 
var externalEndPoint = host.AddServiceEndpoint(typeof(IExternalServiceContract), webHttpBidning, "External"); 
externalEndPoint.Behaviors.Add(new WebHttpBehavior()); 

Они в настоящее время и размещены на тот же порт, который я хочу, чтобы избежать, я довольно новыми для WCF, и я мог бы реально использовать некоторые рекомендации для лучших практика и то, что я делаю неправильно. Как упоминалось ранее, «BasicHttpBinding» может быть заменено именованным каналом, если моя проблема может быть решена.

Ожидая услышать мнение экспертов, и если вам нужна clearification, не стесняйтесь спросить :)

+0

', что сбой службы или переходит в автономном режиме клиент также должен быть перезапущен, чтобы иметь возможность установить связь со службой через named pipes. 'Это означает, что вы неправильно обрабатываете ошибки. вам нужно уничтожить прокси-сервер и создать новый, чтобы восстановить соединение. Именно поэтому перезапуск клиента решает его, поскольку это новый экземпляр прокси. Как только ошибка прокси-сервера, он никогда не сможет использоваться снова. –

+0

Спасибо за ответ. Если я обнаруживаю привязку именованного канала через MEX, как я могу уничтожить прокси-сервер, и я должен делать это каждый раз? Пример кода или ссылка были бы очень приятными :) – SOK

+0

https://github.com/rmandvikar/WcfServiceClientHelper отлично подходит для управления созданием прокси-сервера для вас –

ответ

1

Я решил эту проблему с помощью следующего кода на сервере. На клиентах, которые взаимодействуют с сервером по именованным каналам, я использовал библиотеку «WcfClientProxyGenerator» для создания отказоустойчивых клиентских прокси.

_namedPipeAddress = "net.pipe://localhost/"; 
_httpAddress = "http://localhost:8000"; 

var host = new ServiceHost(serviceContract, new Uri(_namedPipeAddress), new Uri(_httpAddress)); 

host.Description.Behaviors.Add(new ServiceMetadataBehavior { }); 

var behaviour = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behaviour.InstanceContextMode = InstanceContextMode.Single; 
behaviour.IncludeExceptionDetailInFaults = true; 

// Local Endpoint 
host.AddServiceEndpoint(typeof(ILocalServiceContract), new NetNamedPipeBinding(), "Local"); 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexNamedPipeBinding(), "mex"); 

//// External Endpoint 
var webHttpBidning = new WebHttpBinding { TransferMode = TransferMode.Streamed }; 
var externalEndPoint = host.AddServiceEndpoint(typeof(IExternalServiceContract), webHttpBidning, new Uri(_httpAddress)); 
externalEndPoint.Behaviors.Add(new WebHttpBehavior()); 

Для дальнейшего совершенствования этого решения не стесняйтесь комментировать :)