【问题标题】:Multiple interfaces from a single WCF service?来自单个 WCF 服务的多个接口?
【发布时间】:2025-12-07 13:00:02
【问题描述】:

单个 WCF 服务能否提供多个接口,如果可以,您将如何在 app.config 中表达这一点?

我的意思是一种服务在一个端点上提供多个接口。

【问题讨论】:

    标签: .net wcf interface


    【解决方案1】:

    首先您需要明确什么是服务。您是指单个端点,还是同一主机中的多个端点?

    假设您指的是单个端点,那么可以,但需要做一些工作。一个端点只能实现一个接口;所以你需要做的就是将你想要实现的所有接口组合成一个接口

    public interface IMyInterface : IInterface1, IInterface2
    

    然后在你的实现类中实现它们。你不能做的是让多个接口和多个实现神奇地合并到一个端点。

    【讨论】:

    • 谢谢,这正是我要问的。
    • 简单,聪明!出色的解决方案。来自我的 +1
    • 我有两个接口,我必须做两个服务吗?我可以使用两个接口,每个接口在同一个服务中都有一个端点吗?
    • 但是我们需要一个类来实现IMyInterface。那么如何在该类中包含其他接口的方法呢?
    • @blowdart,如果有多个合同,最好的设计是什么?主机是相同的。我们应该像你建议的那样有多个端点或单个端点。从客户的角度来看。
    【解决方案2】:

    下面看起来更接近初衷,不涉及大界面...

    单个 ListenUri 中的多个端点:http://msdn.microsoft.com/en-us/library/aa395210.aspx


    上面链接的示例说明可以在同一个物理地址 (listenUri) 注册多个端点,每个端点都实现不同的接口(合同),例如:

    <endpoint address="urn:Stuff"
            binding="wsHttpBinding"
            contract="Microsoft.ServiceModel.Samples.ICalculator" 
            listenUri="http://localhost/servicemodelsamples/service.svc" />
    <endpoint address="urn:Stuff"
            binding="wsHttpBinding"
            contract="Microsoft.ServiceModel.Samples.IEcho" 
            listenUri="http://localhost/servicemodelsamples/service.svc" />
    <endpoint address="urn:OtherEcho"
            binding="wsHttpBinding"
            contract="Microsoft.ServiceModel.Samples.IEcho" 
            listenUri="http://localhost/servicemodelsamples/service.svc" />
    

    这是可能的,因为传入的消息会根据地址和合约过滤器的组合路由到适当的端点。

    【讨论】:

    • 实际上,当我看到一个可以使用的好答案时,我就停止了阅读。我希望我能及时看到你的回复。 +1,因为这是一个更好的答案,尽管我可以想到适合接受答案的案例。
    • 对于我遇到的问题,这是一个更好的解决方案。它允许我拥有两种不同类型的序列化程序,这是我的解决方案所必需的。
    【解决方案3】:

    使用 WCF,您可以:

    • 拥有一个实现多个服务接口的服务实现类
    • 通过多个端点公开一个服务实现类,例如一个服务端点使用 BasicHttpBinding 实现最大互操作性,另一个端点使用 NetTcpBinding 实现最大性能(使用 WCF 客户端)。

    【讨论】:

      【解决方案4】:

      如果您的实现类变得太大(如我的),请尝试在部分类中实现超级接口。您可以将一个接口实现放入一个文件中。这只是一个约定,但以后可能会有用。

      【讨论】:

        【解决方案5】:

        如果这是您的要求,您可以在 App.Config 中的两个不同端点上公开相同的接口。

        <service name="Service1">    
           <endpoint address="http://localhost:8001/service1.asmx" binding="basicHttpBinding" contract="IService" />
        </service>
        <service name="Service2">    
          <endpoint address="http://localhost:8002/service2.asmx" binding="basicHttpBinding"  contract="IService" />
        </service>
        

        【讨论】:

        • 现在是 2020 年,我仍在使用 WCF。假设合同不同,为端点提供两种单独的服务与为两个端点提供一种服务有什么特别的好处吗?