使用多个合同但单个代理

时间:2015-05-14 15:40:11

标签: c# wcf proxy

我创建了一些合同:

[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" />

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

1 个答案:

答案 0 :(得分:3)

正如Tim所说的终点ABC - 地址,约束和合同。

每个类只能有一个代理,这是概念,设计和WCF的实现。否则,客户端程序员(用户)将会感到困惑,并且可能会头疼。

从技术上讲,您可以与单个代理签订多个合同,但是,您必须在客户端从头开始构建所有内容,而不是使用WCF。

在客户端使用WCF时,无论是通过svcutil.exe生成代理类还是手工制作,都将使用System.ServiceModel.ClientBase作为代理类的基类。由于ClientBase只需要1个合约,因此每个合约都有一个代理类。

对于一份合同,您可以发布多个端点。

在上面的配置中,您已声明了2个端点,其中包含2个不同绑定的合同。客户端将看到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.因为客户只关心合同,而不是实现。

代理类不了解绑定。在您的客户端代码或客户端配置中确定要使用的绑定。

合同,实施,端点,绑定,地址和客户代理是不同方面的分离关注点,因此不要混淆它们。