2016-10-17 13 views
0

Я пытаюсь изменить номер порта, на котором прослушивается моя самообслуживаемая служба WCF. Для этого я попытался остановить ServiceHost, добавив новую ServiceEndpoint с новым портом и перезапустив ServiceHost. Однако это не работает, и он бросает это исключение:Как изменить номер порта NetTcpBinding ServiceEndpoint, зарегистрированного в ServiceHost

System.InvalidOperationException: Endpoints не может быть добавлен после того, как ServiceHost был открыт/неисправным/прерванным/закрыто.

Вот мой тестовый код:

[Fact] 
    public async Task IsRunning_ForServerRunning_IsTrue() 
    { 
     server.Close(); 
     var newPortNumber = 6767; 
     server.Open(newPortNumber); 
     Assert.True(server.IsRunning); 
    } 

и это AutomationServer:

public class AutomationServer : IAutomationServer 
{ 
    private ServiceHost svh; 
    private IAutomationService service; 

    public AutomationServer(IAutomationService service) 
    { 
     svh = new ServiceHost(service); 
    } 

    public void Open(int port = 0) 
    { 
     Open(port, null); 
    } 

    public void Open(int port, string host) 
    { 
     //if (port != 0) 
     this.port = port; 

     if (host == null) 
      host = Dns.GetHostEntry("").HostName; 
     var baseUri = new Uri("net.tcp://" + host + ":" + this.port); 
     Open(baseUri); 
    } 

    public void Open(Uri baseUriAddress) 
    { 
     var serviceEndpoint = svh.AddServiceEndpoint(
     typeof(IAutomationService), 
     new NetTcpBinding(), 
     baseUriAddress); 

     if (baseUriAddress.Port == 0) 
      AutoAssignPortNumber(ref serviceEndpoint); 

     svh.Open(); 
     IsRunning = true; 
    } 

    private void AutoAssignPortNumber(ref ServiceEndpoint serviceEndpoint) 
    { 
     serviceEndpoint.ListenUriMode = ListenUriMode.Unique; 
    } 

    public void Close() 
    { 
     svh.Close(); 
     IsRunning = false; 
    } 

    ... properties, etc. 
} 

Так это правильный способ просто «отбросить» старую ServiceHost и создать новый ServiceHost с новое связывание в ServiceEndpoint или мне что-то не хватает?

ответ

0

Хорошо. Я закончил тем, что просто создал еще один экземпляр ServiceHost с новой настройкой ServiceEndpoint на нужный порт. Не знаю, идеально ли это, но это работает.