1

私は、winform アプリでホストされている 2 つの WCF サービスを持っています。状況によっては、pollingduplex エンドポイントが正しく開かず、クライアントが接続されないことがあります。これを検出できるようにするために、Silverlight out of browser app はインターフェイスをポーリングし、応答を受信すると、tcp ソケットを介してサービスに通知します。

Out-of-browser アプリの通知が届かない場合、wcf サービスを再起動したいと考えています。両方のサービスで servicehost.close() を呼び出し、その後に servicehost.open() を呼び出します。

http://localhost:18524/IService/奇妙なことに、basichttp バインディングを使用したサービスのオープン/クローズは成功しますが、ポーリング デュプレックス バインディングを使用したサービスのオープンはChanneldispatcher 例外で失敗します。サービスホスト。

pollingduplex チャネルのオープン/クローズ タイムアウトで遊んで、クローズ/オープン間の時間を遅らせましたが、効果はありませんでした。

pollingduplex 接続のポートを解放する方法を知っている人はいますか?

手伝ってくれてありがとう。

オープン クローズ コード: public void StartServices() { StopServices();

        try
        {
            var configSyncService = new ConfigurationSyncService();
            configSyncService.Open();

            var mainService = new Service();
            mainService.Open();

            serviceHosts.Add(configSyncService);
            serviceHosts.Add(mainService);
        }
        catch (Exception ex)
        {
            string msg = String.Format("Exception starting WCF service for Centrale:  {0}", ex.Message);

            LOG.Fatal(
                LogProperties.Bedienpost,
                ex,
                Resources.ERROR_STARTING_WCF,
                ex.Message);

            throw ex;
        }
     }

    public void StopServices()
    {
        try
        {
            var result = Parallel.ForEach(serviceHosts, service =>
            {
                if ((service != null) && (service.State == CommunicationState.Opened))
                {
                    try
                    {
                        service.Close();
                    }
                    finally
                    {
                        service.Dispose();
                        service = null;
                    }
                }
                else if ((service != null) && (service.State != CommunicationState.Faulted))
                {
                    service.Dispose();
                    service = null;
                }
            });

            if (result.IsCompleted)
            {
                serviceHosts.Clear();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

ポーリング二重チャネルの構成:

private Binding CreateCustomPollingDuplexBinding()
    {
        CustomBinding binding = new CustomBinding();
        binding.Name = "pollingDuplexHttpBinding";

        binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
        binding.SendTimeout = new TimeSpan(0, 5, 0);
        binding.OpenTimeout = new TimeSpan(0, 5, 0);
        binding.CloseTimeout = new TimeSpan(0, 5, 0);

        binding.Elements.Add(new PollingDuplexBindingElement(PollingDuplexMode.SingleMessagePerPoll));

        TextMessageEncodingBindingElement textEncoding = new TextMessageEncodingBindingElement();
        textEncoding.ReaderQuotas.MaxArrayLength = int.MaxValue;
        textEncoding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
        textEncoding.ReaderQuotas.MaxDepth = int.MaxValue;
        textEncoding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
        textEncoding.ReaderQuotas.MaxStringContentLength = int.MaxValue;

        binding.Elements.Add(textEncoding);

        HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
        httpTransport.MaxBufferPoolSize = int.MaxValue;
        httpTransport.MaxBufferSize = int.MaxValue;
        httpTransport.MaxReceivedMessageSize = int.MaxValue;
        httpTransport.AuthenticationScheme = AuthenticationSchemes.Ntlm;

        binding.Elements.Add(httpTransport);

        return binding;
    }
4

0 に答える 0