【问题标题】:Is it possible to use WCF discovery to expose a WCF endpoint that is using named pipes?是否可以使用 WCF 发现来公开使用命名管道的 WCF 端点?
【发布时间】:2015-11-09 06:59:19
【问题描述】:

我有一个使用发现的应用程序,它可以本地部署在同一台 PC 上,也可以远程部署在它使用的服务之外。有没有办法通过 WCF 发现公开命名管道绑定?如果不是,我想我可以在发现服务后进行协商以确定最合适的绑定。

【问题讨论】:

    标签: c# .net wcf network-programming


    【解决方案1】:

    是的,可以这样做。但由于地址将被列为“localhost”(net.pipe 唯一可能的地址),您可能需要进行某种测试来验证该服务实际上与发现客户端在同一台机器上运行。

    public class StackOverflow_7068743
    {
        [ServiceContract]
        public interface ITest
        {
            [OperationContract]
            string Echo(string text);
        }
        public class Service : ITest
        {
            public string Echo(string text)
            {
                return text + " (via " + OperationContext.Current.IncomingMessageHeaders.To + ")";
            }
        }
        public static void Test()
        {
            string baseAddressHttp = "http://" + Environment.MachineName + ":8000/Service";
            string baseAddressPipe = "net.pipe://localhost/Service";
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddressHttp), new Uri(baseAddressPipe));
            host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
            host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
            host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
            host.AddServiceEndpoint(typeof(ITest), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "");
            host.Open();
            Console.WriteLine("Host opened");
    
            DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
            FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ITest)));
            Console.WriteLine(findResponse.Endpoints.Count);
    
            EndpointAddress address = null;
            Binding binding = null;
            foreach (var endpoint in findResponse.Endpoints)
            {
                if (endpoint.Address.Uri.Scheme == Uri.UriSchemeHttp)
                {
                    address = endpoint.Address;
                    binding = new BasicHttpBinding();
                }
                else if (endpoint.Address.Uri.Scheme == Uri.UriSchemeNetPipe)
                {
                    address = endpoint.Address;
                    binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
                    break; // this is the preferred
                }
    
                Console.WriteLine(endpoint.Address);
            }
    
            if (binding == null)
            {
                Console.WriteLine("No known bindings");
            }
            else
            {
                ChannelFactory<ITest> factory = new ChannelFactory<ITest>(binding, address);
                ITest proxy = factory.CreateChannel();
                Console.WriteLine(proxy.Echo("Hello"));
                ((IClientChannel)proxy).Close();
                factory.Close();
            }
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    

    【讨论】:

    • 如果服务由 ASP.net Web 应用程序托管,则命名管道端点的基地址是“net.pipe://{macinename}/Service”。在这种情况下,同一台机器上的客户端可以使用“localhost”而不是机器名吗?
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2010-09-16
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多