WCF 中不同端口上的不同服务
Different services on different ports in 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' 可能会被命名管道替换。
期待听到专家的意见,如果您需要任何澄清,请随时询问 :)
我在服务器上使用以下代码解决了这个问题。在通过命名管道与服务器通信的客户端上,我使用“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());
如需进一步改进此解决方案,请随时发表评论:)
我想使用 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' 可能会被命名管道替换。
期待听到专家的意见,如果您需要任何澄清,请随时询问 :)
我在服务器上使用以下代码解决了这个问题。在通过命名管道与服务器通信的客户端上,我使用“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());
如需进一步改进此解决方案,请随时发表评论:)