我处于一种我希望使用WCF来暴露两个不同接口的情况:
外部接口不应该能够看到或使用内部接口,因此我想到的是在不同的端口上托管两个服务,例如(内部为8000,外部为8001),然后阻止端口8000上的所有外部通信。
此外,我试图摆弄使用命名管道进行IPC通信,我遇到了一个问题。如果发生意外情况,服务崩溃或脱机,则还必须重新启动客户端,以便能够通过命名管道与服务建立通信。这是正常的行为吗?可以避免吗?
到目前为止,我有以下代码:
$.each(data.result, function(i, post) {
$("#magix").append("<li>" + post.CODE + "</li>");
});
它们目前都托管在我想要避免的同一个端口上,我对WCF很新,我真的可以使用一些指导来进行最佳实践以及我做错了什么。如前所述,如果我的问题可以解决,'BasicHttpBinding'可以用命名管道替换。
期待听取专家的意见,如果您需要任何澄清,请随时询问:)
答案 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());
对于此解决方案的进一步改进,请随意评论:)