У меня есть приложение WPF C #, на котором размещается служба WCF. У меня есть процедура, чтобы запустить службу, закрывая ее, если она уже существует. WebServce является свойством типа ServiceHost:
public void Start()
{
try
{
var certificate = new X509Certificate2(certpath, "");
String uri = "net.tcp://" + WCFAddress + "/MyService";
Uri baseaddress = new Uri(uri);
if (WebService != null) {
try {
WebService.Close();
} catch (Exception) {
WebService.Abort();
}
}
WebService = new ServiceHost(MessageProvider, baseaddress);
WebService.Credentials.ServiceCertificate.Certificate = certificate;
WebService.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
WebService.AddServiceEndpoint(typeof(IMessageService), binding, baseaddress);
WebService.Open();
}
catch (Exception e)
{
//exception handling
}
}
Это отлично работает при запуске. Это также работает нормально, если я изменяю номер порта (в WCFAddress) и снова вызываю подпрограмму. Это также работает, если я изменю адрес на главном компьютере и вызову его с новым IP-адресом. Однако, если я изменю IP-адрес на неверный, служба перейдет в состояние Failed с ошибкой:
e = {"Ошибка TCP (10049: запрошенный адрес недопустим в своем контексте) произошла при прослушивании конечной точки IP = 192.168.1.4: 5000."}
Вызов Close () в приведенном выше примере не вызывает исключения.
Если я затем изменяю IP-адрес на правильный и повторяю вызов, я получаю ту же ошибку с тем же старым неправильным адресом, даже если я передал его правильный. Также на этот раз вызов Close () вызывает ошибку из-за состояния Faults, что приводит к вызову Abort ().
Я думал, что вызов Abort () позволит затем создать службу заново? Почему при попытке создать службу с новым выдается ошибка со старым адресом? Как будто он висит на старой ServiceEndpoint?