当前位置:  开发笔记 > IOS > 正文

WCF:Net.TCP多个绑定,相同的端口,不同的IP地址

如何解决《WCF:Net.TCP多个绑定,相同的端口,不同的IP地址》经验,为你挑选了1个好方法。

我遇到了一个问题.我在WCF有点新,所以任何帮助都会有很大的帮助.

这是我的代码:

public static void StartHosts()
    {
        try
        {
            // Create a new host
            ServiceHost host = new ServiceHost(typeof(ServerTasks));

            List ips = new List(Dns.GetHostAddresses(Dns.GetHostName()));
            if (IPAddress.Loopback != null)
                ips.Add(IPAddress.Loopback);

            ips.RemoveAll(i => i.AddressFamily != AddressFamily.InterNetwork);

            foreach (var ip in ips)
            {
                string uri = string.Empty;

                // Formulate the uri for this host
                uri = string.Format(
                    "net.tcp://{0}:{1}/ServerTasks",
                    ip.ToString(),
                    ServerSettings.Instance.TCPListeningPort
                );


                // Add the endpoint binding
                host.AddServiceEndpoint(
                    typeof(ServerTasks),
                    new NetTcpBinding(SecurityMode.Transport) { TransferMode = TransferMode.Streamed },
                    uri
                );

            }



            // Add the meta data publishing
            var smb = host.Description.Behaviors.Find();
            if (smb == null)
                smb = new ServiceMetadataBehavior();

            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            host.Description.Behaviors.Add(smb);

            host.AddServiceEndpoint(
                ServiceMetadataBehavior.MexContractName,
                MetadataExchangeBindings.CreateMexTcpBinding(),
                "net.tcp://localhost/ServerTasks/mex"
            );

            // Run the host
            host.Open();
        }
        catch (Exception exc)
        {
            DebugLogger.WriteException(exc);
        }
    }

行抛出异常:'host.Open();'

例外是:

System.InvalidOperationException URI'net.tcp://192.168.1.45:4329/ServerTasks'已存在注册.

我想要做的是绑定到机器上的所有网络地址,以便客户端应用程序可以从他们看到的任何网络到达服务.当我运行此代码时,它会找到并尝试为大约5个不同的IP设置绑定,包括127.0.0.1.

192.168.1.45是它尝试绑定的第二个IP.在它抛出异常的时候,我可以看到(使用netstat)程序已经绑定到端口4329上列表中的第一个IP.在异常中提到的地址上没有绑定到端口4329的任何东西.

对不起,这里没有太多细节,我想简要介绍一下.如果有人需要更多信息我会乐意提供它.

注意:我已经尝试将PortSharingEnabled设置为true,以便在foreach循环中创建NetTcpBinding,但我仍然遇到相同的错误.

任何帮助或建议将非常适合!

谢谢



1> Mel Green..:

感谢Corazza的信息!

我已经想出如何实现这一目标.我正在以错误的方式解决这个问题.

我的最终目标是让服务监听机器上可用的每个IP地址.尝试单独绑定到每个地址是这样做的错误方法.

相反,我只需要将服务绑定到计算机的主机名(而不是'localhost'),WCF会自动侦听所有适配器.

这是更正后的代码:

public static void StartHosts()
    {
        try
        {
            // Formulate the uri for this host
            string uri = string.Format(
                "net.tcp://{0}:{1}/ServerTasks",
                Dns.GetHostName(),
                ServerSettings.Instance.TCPListeningPort
            );

            // Create a new host
            ServiceHost host = new ServiceHost(typeof(ServerTasks), new Uri(uri));

            // Add the endpoint binding
            host.AddServiceEndpoint(
                typeof(ServerTasks),
                new NetTcpBinding(SecurityMode.Transport) 
                        { 
                            TransferMode = TransferMode.Streamed
                        },
                uri
            );

            // Add the meta data publishing
            var smb = host.Description.Behaviors.Find();
            if (smb == null)
                smb = new ServiceMetadataBehavior();

            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            host.Description.Behaviors.Add(smb);

            host.AddServiceEndpoint(
                ServiceMetadataBehavior.MexContractName,
                MetadataExchangeBindings.CreateMexTcpBinding(),
                "net.tcp://localhost/ServerTasks/mex"
            );

            // Run the host
            host.Open();
        }
        catch (Exception exc)
        {
            DebugLogger.WriteException(exc);
        }
    }

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有