我正在尝试修改我的自托管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,还是我错过了什么?
答案 0 :(得分:0)
确定。我最终只是创建了另一个ServiceHost实例,并将新的ServiceEndpoint设置为所需的端口。不知道这是否理想,但它确实有效。