UDP-обнаружение WCF работает только для BasicHttpBinding, но не для NetTcpBinding - PullRequest
0 голосов
/ 04 октября 2018

У меня есть служба WCF, которая объявила о двух конечных точках службы.Один для net.tcp, а другой для http.

net.tcp: // localhost: 11110 / MyService

http://localhost:11111/MyService

        // Make service discoverable 
        var discoveryBehavior = new ServiceDiscoveryBehavior();
        var announceEndpointAddress = ConfigurationManager.AppSettings["AnnouncementEndpoint"];

        var netTcpBinding = new NetTcpBinding(SecurityMode.None)
        {
            ReceiveTimeout = TimeSpan.MaxValue,
            SendTimeout =  TimeSpan.MaxValue,
            OpenTimeout =TimeSpan.MaxValue,
            CloseTimeout =  TimeSpan.MaxValue
        };

        discoveryBehavior.AnnouncementEndpoints.Add(
            new AnnouncementEndpoint(netTcpBinding,
            new EndpointAddress(announceEndpointAddress)
        ));
        _serviceHost.Description.Behaviors.Add(discoveryBehavior);
        _serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

На стороне клиента я использую WCFDiscovery.

class Program
{
    static void Main(string[] args)
    {
        var optionalBindings = new Binding[]
        {
            new NetTcpBinding(),
            new BasicHttpBinding(),
            new NetNamedPipeBinding()
        };

        var executed = false;

        foreach (var binding in optionalBindings)
        {
            var contract = ContractDescription.GetContract(typeof(IMyService));
            var endpoint = new DynamicEndpoint(contract, binding);

            var factory = new ChannelFactory<IMyService>(endpoint);
            var proxy = factory.CreateChannel();

            try
            {
                var result = proxy.GetData(123456);

                ((ICommunicationObject) proxy).Close();

                executed = true;
                break;
            }
            catch (EndpointNotFoundException)
            {
                // Ignored
            }
        }
    }
}

Что меня смущает, так это то, что он работает только с BasicHttpBinding и никогда не работает с NetTcpBinding.Так что если BasicHttpBinding из списка AdditionalBindings, я не могу вызвать службу, хотя конечная точка net.tcp есть.

Может кто-нибудь объяснить причину этого?

...