0

私の症状は、この投稿で説明されているとおりです。障害状態からの回復

これは既知のバグなのだろうか。

私のコードは Dave のものとは少し異なりますが、彼の ServiceHost インスタンス (WebService という名前) は Start() メソッドの外にあります。私の ServiceHost インスタンス (名前付きホスト) は内部で宣言されています。デバッグ時に、エンドポイントのアドレスが正しい IP に変更されていることをホストの説明で確認します。ただし、Open() は依然として古い間違った IP アドレスで例外をスローします。

    private bool InitHost(PtiType type, string serverIp, int portNumber)
    {
        if (!HostDictionary.ContainsKey(type))
        {
            Uri addressBase = new Uri(String.Format("net.tcp://{0}:{1}/CommunicationService/{2}", serverIp, portNumber.ToString(), type.ToString()));
            var service = new PtiCommunicationService(type);

            service.ClientConnected += service_ClientConnected;
            service.ClientBroadcasted += service_ClientBroadcasted;
            service.ClientSentTo += service_ClientSentTo;
            service.ClientDisconnected += service_ClientDisconnected;

            var host = new ServiceHost(service, addressBase);

            //For publishing metadata only
            //Define Metadata endPoint, So we can publish information about the service
            ServiceMetadataBehavior mBehave = new ServiceMetadataBehavior();
            host.Description.Behaviors.Add(mBehave);

            //Enable debug info in fault
            ((ServiceDebugBehavior)host.Description.Behaviors[typeof(ServiceDebugBehavior)]).IncludeExceptionDetailInFaults=true;

            host.AddServiceEndpoint(typeof(IPtiCommunication), new NetTcpBinding(SecurityMode.None), "");
            host.AddServiceEndpoint(typeof(IMetadataExchange),
                MetadataExchangeBindings.CreateMexTcpBinding(),
                "mex");

            try
            {
                host.Open();

                //Add host to dictionary to keep track
                HostDictionary.Add(type, host);

                LogList.Add(String.Format("{0}\tThe service {1} at {2} is ready", DateTime.Now.ToLongTimeString(), service.ServiceType.ToString(), serverIp));

                string hostInfo = String.Format("{0}\tHost information:\n", DateTime.Now.ToLongTimeString());

                hostInfo += "Enpoints details:\n";
                foreach (var endpt in host.Description.Endpoints)
                {
                    hostInfo += String.Format("\t Name:\t\t{0}\n", endpt.Name);
                    hostInfo += String.Format("\t Logical address:\t{0}\n", endpt.Address);
                    hostInfo += String.Format("\t Physical address:\t{0}\n", endpt.ListenUri);
                    hostInfo += String.Format("\t Binding:\t\t{0}\n", endpt.Binding);
                    hostInfo += String.Format("\t Contract:\t{0}\n\n", endpt.Contract.ContractType.Name);
                }
                LogList.Add(hostInfo);
            }
            catch (Exception e)
            {
                host.Abort();
                host = null;
                LogList.Add(String.Format("{0}\t{1}", DateTime.Now.ToLongTimeString(), e.Message));
            }
            return true;
        }
        return false;
    }

PtiCommunicationService の ServiceBehavior は次のとおりです。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
 ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]

インターフェイスのServiceContract

[ServiceContract(CallbackContract = typeof(IPtiCommunicationCallback), SessionMode = SessionMode.Required)]

app.config には他の構成はありません。すべてはコードにあります。

ありがとう

アップデート:

Web サービスのシングルトンを作成する ServiceHost コンストラクター (オブジェクト、Uri[]) に対して、私たちの両方が同じオーバーロードを使用していることを発見しました。

同じシングルトンで新しいサービス ホストを作成すると、ホストが中止されてもサービスのインスタンスがまだ存在するため、何らかの理由でエンドポイント アドレスの変更が反映されません。

新しいホストを作成するときにそのシングルトンをクリーンアップするソリューションはありますか?

それは今のところ私の疑いです。間違っていたら訂正してください。

4

1 に答える 1