WCF中不同端口上的不同服务

时间:2016-05-12 18:58:03

标签: c# wcf wcf-data-services wcf-binding

我处于一种我希望使用WCF来暴露两个不同接口的情况:

  • 内部(IPC通信)
  • 外部(Http REST)

外部接口不应该能够看到或使用内部接口,因此我想到的是在不同的端口上托管两个服务,例如(内部为8000,外部为8001),然后阻止端口8000上的所有外部通信。

此外,我试图摆弄使用命名管道进行IPC通信,我遇到了一个问题。如果发生意外情况,服务崩溃或脱机,则还必须重新启动客户端,以便能够通过命名管道与服务建立通信。这是正常的行为吗?可以避免吗?

到目前为止,我有以下代码:

$.each(data.result, function(i, post) {
  $("#magix").append("<li>" + post.CODE + "</li>");
});

它们目前都托管在我想要避免的同一个端口上,我对WCF很新,我真的可以使用一些指导来进行最佳实践以及我做错了什么。如前所述,如果我的问题可以解决,'BasicHttpBinding'可以用命名管道替换。

期待听取专家的意见,如果您需要任何澄清,请随时询问:)

1 个答案:

答案 0 :(得分: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());

对于此解决方案的进一步改进,请随意评论:)