绑定到所有IP并生成有效链接

时间:2012-08-01 00:34:49

标签: .net wcf binding

我有一个将在多台服务器上运行的应用程序。它公开了WCF端点。我希望端点可以使用环回和服务器拥有的任何其他IP(我不想配置每个端口的IP地址,特别是因为它们可能会发生变化)

该应用程序同时作为Windows服务和控制台应用程序运行。我知道我可以使用http://0.0.0.0/<Blah>/语法绑定到所有地址,但是wsdl中的链接等...无论在请求页面时使用了哪个IP,都会引用IP地址0.0.0.0

有什么方法可以让WCF使用所有IP并对它们做出正确回应?

1 个答案:

答案 0 :(得分:1)

这是一个动态绑定到所有可操作的IPV4套接字的示例。当然,您仍然需要跟踪绑定到的地址和端口,并将它们报告给实现GetKnownNodes()函数的任何服务。请注意,我正在更改端口以避免与环回地址和外部IP冲突。当然,这可以用不同的方式处理。

using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.ServiceModel;

namespace Stackoverflow11750995
{
    [ServiceContract]
    public interface ITimeService
    {
        [OperationContract]
        string TimeAsString();
    }

    public class TimeService : ITimeService
    {
        public string TimeAsString()
        {
            return string.Format("The time is {0:f}", DateTime.Now);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var host = new ServiceHost(typeof(Stackoverflow11750995.TimeService)))
            {
                int port = 12345;

                foreach (var adpt in NetworkInterface.GetAllNetworkInterfaces())
                {
                    if (adpt.OperationalStatus == OperationalStatus.Up)
                    {
                        foreach (var addr in adpt.GetIPProperties().UnicastAddresses)
                        {
                            if (addr.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                string uri = string.Format("net.tcp://{0}:{1}/Service", addr.Address, port++);
                                host.AddServiceEndpoint(typeof(ITimeService), new NetTcpBinding(), uri);
                            }
                        }
                    }
                }

                host.Open();

                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }
        }
    }
}