2个绑定,相同的端口,不同的IP地址

时间:2015-07-23 09:19:59

标签: c# wcf tcp windows-services wcf-binding

我正在尝试端口共享,它不适合我。

在一台服务器上,我有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;
    }
}

0 个答案:

没有答案