клиент веб-службы c # wcf https-соединение никогда не закрывается

#c# #web-services #wcf #https #basichttpbinding

#c# #веб-службы #wcf #https #basichttpbinding

Вопрос:

Я использую простой клиент службы c # Windows для удаленного веб-сервиса. Все работает отлично, но когда я делаю запрос данных к веб-сервису, а затем закрываю клиент и фабрику, соединение https не закрывается. (Я вижу это с помощью команды netstat -n). Почему? Есть идеи?

Это мой код:

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

        string address = AppSettings.Instance.address;
        if (address.Contains("https"))
            binding.Security.Mode = BasicHttpSecurityMode.Transport;

        binding.MaxBufferSize = 2147483647;
        binding.MaxBufferPoolSize = 2147483647;
        binding.MaxReceivedMessageSize = 2147483647;

        XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas();
        readerQuotas.MaxStringContentLength = 2147483647;
        binding.ReaderQuotas = readerQuotas;

        ChannelFactory<NotifierServiceChannel> factory = new ChannelFactory<NotifierServiceChannel>(binding, address);

        factory.Closed  = Factory_Closed;
        factory.Closing  = Factory_Closing;
        factory.Faulted  = Factory_Faulted;
        factory.Opened  = Factory_Opened;
        factory.Opening  = Factory_Opening;

        foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
        {
            DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior;
            if (dataContractBehavior != null)
                dataContractBehavior.MaxItemsInObjectGraph = 2147483647;
        }
        factory.Open();

        using (NotifierServiceChannel client = factory.CreateChannel())
        {
            client.Closed  = _client_Closed;
            client.Closing  = _client_Closing;
            client.Faulted  = _client_Faulted;
            client.Opened  = _client_Opened;
            client.Opening  = _client_Opening;
            client.UnknownMessageReceived  = _client_UnknownMessageReceived;

            client.Open(new TimeSpan(0, 0, 10));

            GetIdRequest requestId = new GetIdRequest();
            GetIdResponse responseId = client.GetIdResponse(requestId);

            LogManager.LoggerV("client.State = "   client.State.ToString());

            if (client.State == CommunicationState.Faulted)
                client.Abort();
            else
                client.Close();

            LogManager.LoggerV("client.State = "   client.State.ToString());

            client.Dispose();

            LogManager.LoggerV("client.State = "   client.State.ToString());
        }

        LogManager.LoggerV("factory.State = "   factory.State.ToString());

        if (factory.State == CommunicationState.Faulted)
            factory.Abort();
        else
            factory.Close();
 

Комментарии:

1. Вы только что закрыли клиент, который вызвал службу, но не закрыли службу, поэтому служба все еще работает, и вы можете получить к ней доступ.

2. Я не понимаю @TheobaldDu, я имею в виду, что я хотел бы закрыть свое https-соединение со службой, а затем, когда оно мне больше понадобится, я могу открыть другое

3. Ваш вопрос заключается в том, закрыли ли вы клиент, но соединение с сервером еще не закрыто?

4. Нет @TheobaldDu соединение с клиентом и сервером все еще открыто