我正在尝试端口共享,它不适合我。
在一台服务器上,我有2张不同IP 192.168.101.2和192.168.100.1的卡
客户端A仅通过192.168.101.2与服务器建立连接
客户端B仅通过192.168.100.1与服务器建立连接
这就是为什么我需要在相同的端口上启动相同的服务但不同的IP。
internal static ServiceHost myServiceHost = null;
protected override void OnStart(string[] args)
{
if (myServiceHost != null)
{
myServiceHost.Close();
}
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;
binding.Security.Mode = SecurityMode.None;
myServiceHost = new ServiceHost(typeof(Service_WCF));
ushort salt1 = (ushort)new Random().Next();
string address1 = String.Format("net.tcp://192.168.100.1:8733/test/{0}", salt1);
myServiceHost.AddServiceEndpoint(typeof(Interface_WCF), binding, address1);
ushort salt2 = (ushort)new Random().Next();
string address2 = String.Format("net.tcp://192.168.101.2:8733/test/{0}", salt2);
myServiceHost.Open();
}
启动服务时我仍然会遇到异常:
无法启动服务。 System.InvalidOperationException:' net.tcp://192.168.101.2:8733 / test / 27222'中的ChannelDispatcher与合同'" Interface_WCF"'无法打开其IChannelListener。 ---> System.InvalidOperationException:已存在URI' net.tcp://192.168.101.2:8733 / test / 27222'的注册。
编辑1:元数据问题
在EZI评论之后,我将IP更改为net.tcp://0.0.0.0:8733 / test
现在我需要推送元数据:
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = false;
smb.HttpsGetEnabled = false;
myServiceHost.Description.Behaviors.Add(smb);
var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
myServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");
但是在开始服务时:
无法启动服务。 System.InvalidOperationException:找不到与绑定MetadataExchangeTcpBinding的端点的scheme net.tcp匹配的基址。注册的基地址方案是[]。
编辑2:元数据问题 - 已解决
删除行:
binding.PortSharingEnabled = true;
我不知道为什么但是在启用时我无法添加2个端点。
这是我的最终代码:
internal static ServiceHost myServiceHost = null;
protected override void OnStart(string[] args)
{
if (myServiceHost != null)
{
myServiceHost.Close();
}
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
Uri baseAddress = new Uri("net.tcp://0.0.0.0:8733/test");
myServiceHost = new ServiceHost(typeof(Service_WCF), baseAddress);
myServiceHost.AddServiceEndpoint(typeof(Interface_WCF), binding, baseAddress);
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = false;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
myServiceHost.Description.Behaviors.Add(smb);
var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
myServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");
myServiceHost.Open();
}
protected override void OnStop()
{
if (myServiceHost != null)
{
myServiceHost.Close();
myServiceHost = null;
}
}