WCF中,客户端调用服务端一般提供两种方式,一个是和传统的web service很想,就是生成一个service的代理包给客户端使用,但是还有一个更为灵活的,就是使用channel,这个可以更好的利用和实现soa的contract的概念,比较推荐使用
上面一个文章提到的微软的LitwareHR程序里面就给出了例子:
比如
客户端:
static public MainMenuItem[] GetMainMenuList()
{
using (SecureChannel channel = new SecureChannel())
{ return channel.GetMainMenuList(); }
}
private class SecureChannel : ClientBase<IPresentationSC>, IPresentationSC
{
public MainMenuItem[] GetMainMenuList()
{ return base.Channel.GetMainMenuList(); }
}
其中的IPresentationSC以及MainMenuItem都是Contract里面描述的接口以及对象,被服务端和客户端分别使用,客户端识别服务端,这是一个关键。
光是这样显然还是不够的,还需要在配置文件里面指定Endpoint
<endpoint address="http://services.litwarehr.com/SecureHost/Runtime/PresentationService.svc"
behaviorConfiguration="WebCachingBehavior" binding="wsFederationHttpBinding"
bindingConfiguration="SecureConversationBinding" contract="Shp.Runtime.Contract.IPresentationSC"
name="IPresentationSC">
<identity>
<dns value="SaasyLongTailCert" />
</identity>
</endpoint>
对于服务端,上面一个文章已经描述过了,这里给出服务端配置文件的内容
<service behaviorConfiguration="SecureConversationBehavior" name="Shp.Runtime.Services.PresentationService">
<endpoint binding="wsFederationHttpBinding" bindingConfiguration="SecureConversationBinding"
contract="Shp.Runtime.Contract.IPresentationSC" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
总结:调用很方便,,松耦合,通过contract来定义访问服务的内容,包括数据格式,服务提供的operation等等;还可以通过修改配置文件来动态的修改服务调用的ABC,也就是address,binding,contract