0

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

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

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

4

1 回答 1

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();
            }
        }
    }
}
于 2012-08-01T19:51:19.703 回答