使用多个合约,但使用一个代理
本文关键字:一个 代理 | 更新日期: 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个。因为客户端只关心契约,而不关心实现。
代理类不知道绑定。使用哪个绑定在您的客户端代码或客户端配置中确定。
契约、实现、端点、绑定、地址和客户端代理是不同方面的独立关注点,所以不要混淆它们。