Я нахожусь в ситуации, когда я хочу использовать 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, не стесняйтесь спросить :)
', что сбой службы или переходит в автономном режиме клиент также должен быть перезапущен, чтобы иметь возможность установить связь со службой через named pipes. 'Это означает, что вы неправильно обрабатываете ошибки. вам нужно уничтожить прокси-сервер и создать новый, чтобы восстановить соединение. Именно поэтому перезапуск клиента решает его, поскольку это новый экземпляр прокси. Как только ошибка прокси-сервера, он никогда не сможет использоваться снова. –
Спасибо за ответ. Если я обнаруживаю привязку именованного канала через MEX, как я могу уничтожить прокси-сервер, и я должен делать это каждый раз? Пример кода или ссылка были бы очень приятными :) – SOK
https://github.com/rmandvikar/WcfServiceClientHelper отлично подходит для управления созданием прокси-сервера для вас –