每个合同都必须托管在一个 ServiceHost 中?

Each contract has to be hosted in one ServiceHost?

我想在我的服务器中公开两个合约。该服务的应用程序配置文件是:

<services>
      <service name="Interface1Service">
        <endpoint address="" binding ="customBinding" contract="Interface1"
                  bindingName="binding_Interface1" bindingConfiguration="CustomBinding_Interface1" name="epInterface1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Interface1/" />
          </baseAddresses>
        </host>
      </service>

      <service name="Interface2Service">
        <endpoint address="" binding ="customBinding" contract="Interface2"
                  bindingName="binding_Interface2" bindingConfiguration="CustomBinding_Interface1"
                  name="epInterface2Service">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Interface2/" />
          </baseAddresses>
        </host>
      </service>
    </services>

在我的控制台应用程序中托管我拥有的服务:

ServiceHost miHost = new ServiceHost(typeof(Interface1Service));

    miHost.Open();

    ServiceHost miHost2 = new ServiceHost(typeof(Interface2Service));
    miHost2.Open();

    Console.ReadKey();

    miHost.Close();
    miHost2.Close();

我怀疑这是否是公开这两个服务的正确方法,或者是否有任何方法只使用一个 serviceHost 来做到这一点。

因为我看到很多相关操作的契约是很常见的,比如一个接口修改产品,一个接口修改人员,另一个接口订单...等等

非常感谢。

..is any way to use only one serviceHost to do that?

当然可以在单个托管容器中公开多个服务合同。您只需要创建一个实现所有服务接口的 class:

public class MyService : Interface1, Interface2
{
    // implement your operations here...
}

// then create service host:
var miHost = new ServiceHost(typeof(MyService)); 

My doubt if this is the correct way to expose the two services..

尽管 WCF 允许您这样做,但您是否应该这样做是另一个问题。

如果服务公开的操作被认为足够不同以至于它们被置于单独的服务合同中,那么这是一个明确的信号,表明这些服务实际上是不同的服务,因此应该被视为不同的服务。

对所有这些不同的服务使用一个通用的具体实现会引入耦合,可能不应该这样做。