2016-10-17 7 views
0

自分のホストするWCFサービスがリッスンするポート番号を変更しようとしています。このために、ServiceHostを停止し、新しいポートで新しいServiceEndpointを追加してから、ServiceHostを再起動しました。しかし、これはうまくいかず、この例外がスローされます。ServiceHostに登録されているNetTcpBinding ServiceEndpointのポート番号を変更する方法

System.InvalidOperationException: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

私は目的のポートに設定された新しいServiceEndpointを持つ別のServiceHostインスタンスを作成しました。それが理想的かどうかは分かりませんが、うまくいきます。

関連する問題