#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 соединение с клиентом и сервером все еще открыто