0

複数のサーバーで実行されるアプリがあります。WCF エンドポイントを公開します。ループバックとサーバーが持つ他の IP の両方を使用してエンドポイントを利用できるようにしたい (特に変更される可能性があるため、それぞれの IP アドレスを構成する必要はありません)

このアプリは、Windows サービスとコンソール アプリの両方として実行されます。構文を使用してすべてのアドレスにバインドできることはわかっていhttp://0.0.0.0/<Blah>/ますが、wsdl 内のリンクなど0.0.0.0は、ページを要求するときに使用された IP に関係なく、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 に答える