如何更改向ServiceHost注册的NetTcpBinding ServiceEndpoint的端口号

时间:2016-10-17 10:04:33

标签: wcf nettcpbinding

我正在尝试修改我的自托管WCF服务侦听的端口号。为此,我尝试停止ServiceHost,使用新端口添加新的ServiceEndpoint,然后重新启动ServiceHost。但是这不起作用,它抛出了这个异常:

  

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并使用ServiceEndpoint中的新绑定创建一个新的ServiceHost,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

确定。我最终只是创建了另一个ServiceHost实例,并将新的ServiceEndpoint设置为所需的端口。不知道这是否理想,但它确实有效。

相关问题