本文将向大家介绍如何托管内部WCF服务和公共WCF服务为了托管内部WCF服务需要建立一个内部端点并使用内部角色通信与在输入端点上托管一个外部服务最主要的区别是内部端点不具有负载均衡特性而输入端点是挂钩在负载均衡器上的具有负载均衡功能 托管内部WCF服务 其实要托管一个内部WCF服务很简单唯一需要注意的是传递给 ServiceHost 的基地址不同因为端口号和IP地址要等到运行时才知道因此需要创建一个主机动态地传递这些信息给它 public override bool OnStart() { // 设置最大并发连接数 ServicePointManagerDefaultConnectionLimit = ; DiagnosticMonitorStart(DiagnosticsConnectionString); // For information on handling configuration changes // see the MSDN topic at RoleEnvironmentChanging += RoleEnvironmentChanging; StartWCFService(); return baseOnStart(); } private void StartWCFService() { var baseAddress = StringFormat( nettcp://{} RoleEnvironmentCurrentRoleInstanceInstanceEndpoints[EchoService]IPEndpoint ); var host = new ServiceHost(typeof(EchoService) new Uri(baseAddress)); hostAddServiceEndpoint(typeof(IEchoService) new NetTcpBinding(SecurityModeNone) echo); hostOpen(); 使用内部WCF服务 我想从我另一个托管的服务调用这个服务下面就是调用这个服务的所有代码 protected void Button_Click(object sender EventArgs e) { var factory = new ChannelFactory<WorkerHostIEchoService>(new NetTcpBinding(SecurityModeNone)); var channel = factoryCreateChannel(GetRandomEndpoint()); LabelText = channelEcho(TextBoxText); } private EndpointAddress GetRandomEndpoint() { var endpoints = RoleEnvironmentRoles[WorkerHost]Instances Select(i => iInstanceEndpoints[EchoService]) ToArray(); var r = new Random(DateTimeNowMillisecond); return new EndpointAddress( StringFormat( nettcp://{}/echo endpoints[rNext(endpointsCount() )]IPEndpoint) ); } 这里唯一要注意的是查询F abric 确定 WorkerHost 角色中实现了 EchoService 端点并随机给它们路由请求的所有端点本来不需要路由请求我这样做是因为内部端点没有负载均衡功能我希望在每个 WorkerHost 实例上均匀地分配负载 我发现一个技巧就是不需要缓存你找到的 IPEndpoint 因为它已经缓存在API调用中但根据最佳实践你应该缓存你的 ChannelFactory 托管公共WCF服务 托管公共WCF服务也很简单唯一需要注意的是要使用一个新的行为为MEX端点处理负载均衡此外在你的服务上需要包括一个类属性处理地址过滤不匹配问题 |