在一个Windows服务中使用单个TCP端口托管多个WCF服务

7
以下是我的应用程序配置文件中关于主机 Windows 服务的片段:

<services>
      <service name="Share.Services.MainService">
        <endpoint address="net.tcp://localhost:8001/MainService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.Services.IClaimService" />
      </service>
      <service name="Share.Services.MainMasterPageService">
        <endpoint address="net.tcp://localhost:8001/MainMasterPageService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.Services.IMainMasterpageService" />
      </service>
      <service name="Share.Services.SMSService">
        <endpoint address="net.tcp://localhost:8001/SMSService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.ServiceContracts.Messaging.ISMSService" />
      </service>
    </services>

有3个WCF服务配置为使用TCP端点,端口号为8001。 在Windows服务中,我使用以下代码注册服务主机:

private static ServiceHost[] Hosts = null;

public static void Start()
{     
    try
    {
        while (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            System.Threading.Thread.Sleep(1000);
        }
        BaseLog.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        Hosts = new ServiceHost[] 
            {
                new ServiceHost(typeof(MainService)), 
                new ServiceHost(typeof(MainMasterPageService)),
                new ServiceHost(typeof(SMSService)) 
            };

        foreach (ServiceHost host in Hosts)
        {
            RegisterServiceHost(host);
        }

        _log.Info("All Hosts Open");
    }
    catch(Exception e)
    {
        _log.Error( "MainServiceHost", e);
    }
}

对于每个ServiceHost对象,我都调用RegisterServiceHost函数,该函数的代码如下:

public static void RegisterServiceHost(ServiceHost host)
{
    var ops = (from e in host.Description.Endpoints
            from o in e.Contract.Operations
            select o).ToList();

    ops.ForEach(
        operation => operation.Behaviors.Add(new MainContextOperationBehavior())
            );

    host.Open();
}

上述代码没有任何问题,运行正确。我的问题是所有服务都在共享同一个8001端口,它们是如何实现共享同一端口的?即使该机器上没有启用Net.TCP端口共享服务。另外我想问的是,这样做会对性能造成影响吗?如果我为每个服务分别指定唯一的端口(例如8001、8002、8003),那么这样做有什么好处?

什么是MainContextOperationBehavior..你能展示一下吗? - Ziggler
1个回答

7
他们可以共享同一个端口,因为它们都有不同的路径。显然这很有效,所以WCF主机足够智能,能够找出如何让它们共享端口8001上的相同侦听套接字。它可以区分请求,因为请求将包括服务名称,这是WCF终结点配置的一部分。
我不认为这会导致任何性能问题,但这完全取决于WCF服务主机的工作方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接