三. 创建和使用代理
SvcUtil生成的代理类派生自类ClientBase<T>,定义为:
public class ClientBase<T> : IDisposable { protected ClientBase(string endpointConfigurationName); protected ClientBase(Binding binding,EndpointAddress remoteAddress); public void Close(); public void Dispose(); protected T InnerProxy{get;} //其它成员 } |
这个InnerProxy属性是客户端需要消费的合同类型,并且SvcUtil生成的ClientBase<T>的子类简单地把它代理到方法调用(见列表5)。客户端需要实例化一个代理对象并且提供给其构造器端点信息-或者是来自配置文件的端点节名(见列表6)或者是在不使用一个配置文件时的端点地址和绑定对象。然后,该客户端可以使用代理方法来调用该服务,并且客户端完成后,它需要关闭该代理实例:
MyContractProxy proxy = new MyContractProxy("MyEndpoint"); proxy.MyMethod(); proxy.Close(); |
关闭代理将终止与服务的会话并且关闭连接。作为选择,你可以使用代理的Dispose()方法来关闭它。Dispose()方法的优点在于,你可以使用using语句来调用它,即使在面临异常处理时:
using(MyContractProxy proxy = new MyContractProxy("MyEndpoint")) { proxy.MyMethod(); } |
在客户端配置文件中的每个合同类型的一个端点可以被指派为一个默认端点。默认端点是一个没有名字标志或只有一个空名("")的端点节:
<system.serviceModel> <client> <endpoint ... contract="IMyContract" /> <endpoint name="OtherEndpoint" ... contract="IMyContract" /> </client> </system.serviceModel> |
一个默认的端点仅仅是一种理想情况;当创建一个针对默认端点的代理时,你可以使用代理的默认构造器来让它使用默认端点:
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.Close(); |
四. 可编程的客户端配置
不依赖于配置文件,客户端也可以通过编程方式来构建端点并且把它提供给代理构造器。列表9(见本文相应下载源码)展示了这一技术,其中展示了等价于列表6中的代码(针对列表2中的服务)。编程配置是很有用的:当端点决策或者是完全动态的-基于当前输入或在运行时刻使用;或当决策是静态的且从不更改时,你最好采用硬编码之。
[上一页] [1] [2] [3] [下一页]