Как правильно перезапустить WCF под новым адресом? - PullRequest
1 голос
/ 20 ноября 2011

У меня есть приложение 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?

1 Ответ

1 голос
/ 20 ноября 2011

Abort ().Затем просто инициируйте новый экземпляр с новым адресом .. затем Open ().

...