使用多个合约,但使用一个代理

本文关键字:一个 代理 | 更新日期: 2023-09-27 17:49:17

我创建了一些合同:

[ServiceContract]
public interface IInterface1
{
    [OperationContract]
    void Method1();
}

[ServiceContract]
public interface IInterface2
{
    [OperationContract]
    void Method2();
}

创建类Implementation.cs,继承它们并实现它们的接口。此外,我为每个合约创建了几个端点,因此不同的操作在不同的协议上工作:

   <service name="Implementation">
    <endpoint binding="netNamedPipeBinding" contract="IInterface1" />
    <endpoint binding="netTcpBinding" contract="IInterface2" />

我希望发现我的服务的客户端只使用一个代理而不是两个。他们是否有可能以某种方式导出单个代理,从而暴露两个合约?

使用多个合约,但使用一个代理

正如Tim所说的端点的ABC——地址、绑定和契约。

每个类只能有一个代理,这是由WCF的概念、设计和实现决定的。否则,客户端程序员(用户)会感到困惑,可能会摸不着头脑。

从技术上讲,您可以使用单个代理拥有多个契约,但是,您必须在客户端从头开始构建所有内容,并且不能使用WCF。

当在客户端使用WCF时,通过svcutil.exe或手工制作生成代理类,您将使用System.ServiceModel.ClientBase作为代理类的基类。因为ClientBase只接受一个合约,所以每个合约只有一个代理类。

对于一个合约,你可以发布多个端点。

在上面的配置中,你在不同的绑定中声明了两个端点和两个契约。客户端将看到2个合约,然后生成2个代理类。

如果您有以下配置

<service name="Implementation">
    <endpoint binding="netNamedPipeBinding" contract="IInterface1" />
    <endpoint binding="netTcpBinding" contract="IInterface2" />
    <endpoint binding="simpleHttpBinding" contract="IInterface1" />
    <endpoint binding="simpleHttpBinding" contract="IInterface2" />
</service>

客户端仍然会生成2个代理类,而不是4个,也不是1个。因为客户端只关心契约,而不关心实现。

代理类不知道绑定。使用哪个绑定在您的客户端代码或客户端配置中确定。

契约、实现、端点、绑定、地址和客户端代理是不同方面的独立关注点,所以不要混淆它们。