在我上一篇文章中介绍了创建第一个WCF应用程序,接下来我们讲一下如何利用配置文件通信的,上篇文章之所以没有提到,是因为IDE自动将客户端的配置文件中的Endpoint与引用服务的Endpoint匹配了。所以客户端和服务端可以通信。服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用。承载服务有两种方式,一种通过配置文件,一种通过代码进行配置(见上面链接)。
一、在讲配置文件之前我们必须了解一个概念那就是服务三要素ABC
(1)A:Adress(地址)在哪里、在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。
A解决了:Where to locate the WCF Service?
(2)B:Binding 怎么实现(与地址的传输方式要匹配), Binding实现在Client和Service通信的所有底层细节。如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?...采用哪种传输协议进行传输,TCP?Http?以及采用什么样的机制解决安全问题,SSL?加密?
B解决了:How to communicate with service?
(3)C:Contract(服务契约)告诉我们哪些事能做,如些事不能做,Contract实际上是把每个方法的转化成为相对应的消息。
C解决了:What functionalities do the Service provide?
在这里我们得到一个公式:Endpoint=A+B+C
二、接下来讲解配置文件。
(1)配置文件概要:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 部署服务库项目时,必须将配置文件的内容添加到
主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
<system.serviceModel>
<!--配置服务节点Start-->
<services>
<!--配置某一服务,在这里可以指定服务名称-->
<service name="WCFDemo.Service1">
</service>
</services>
<!--配置服务节点End-->
<!--配置绑定节点Start-->
<bindings>
<basicHttpBinding></basicHttpBinding>
<mexHttpBinding></mexHttpBinding>
<wsHttpBinding></wsHttpBinding>
</bindings>
<!--配置绑定节点End-->
<!--配置行为节点Start-->
<behaviors>
<serviceBehaviors>
<behavior>
</behavior>
</serviceBehaviors>
</behaviors>
<!--配置行为节点End-->
<!--路由设置Start-->
<routing>
<filters>
<filter name="filter1" filterType="Action"/>
</filters>
</routing>
<!--路由设置End-->
</system.serviceModel>
</configuration>
(2)Service节点
name - 指定这个service配置是针对的那个服务,为一个实现了某些Contract的服务类的名,ServiceHost载入一个服务后,会到配置文件中的<services>下找有没有name属性跟服务匹配的<service>的配置 behaviorConfiguration - 指定在<serviceBehaviors>下的一个<behavior>的name。
<!--属性设置,name:服务的完全限定名,命名空间+实现类名;behaviorConfiguration行为配置,取设置的behavior的名称,具体可见behaviors节点-->
<service name="SecondWCFSample.Service1" behaviorConfiguration="basicBehavior">
</service>
(3)Endpoint节点
指定三个要素ABC,地址(Address),绑定(Binding)以及契约(Contract)
<!--定义endpoint,指定地址(address),绑定(binding)以及协定(contract)-->
<endpoint address ="" binding="wsHttpBinding" contract="WCFDemo.IService1">
<!--服务标识。 部署时,应删除或替换下列标识元素,以反映用来运行所部署服务的标识。删除之后,WCF将自动推断相应标识。-->
</endpoint>
(3)Binging节点
绑定包含以下元素:
协议堆栈确定用于发送到终结点的消息的安全性、可靠性和上下文流设置。
传输确定将消息发送到终结点时使用的基础传输协议,例如 TCP 或 HTTP。
编码确定用于发送到终结点的消息的网络编码,例如,文本/XML、二进制或消息传输优化机制 (MTOM)。
<!--配置绑定节点Start-->
<bindings>
<basicHttpBinding>
<binding name="basic" transferMode="Streamed" messageEncoding="Text" allowCookies="false" textEncoding=""></binding>
</basicHttpBinding>
<netTcpBinding>
</netTcpBinding>
<customBinding>
</customBinding>
</bindings>
<!--配置绑定节点End-->
(4)Behavior节点
Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如Service回调Client的Timeout;Client采用的Credential type;以及是否支持Transaction等
<!--配置行为节点Start-->
<behaviors>
<serviceBehaviors>
<behavior name="basicBehavior">
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
<!--配置行为节点End-->
小结:这篇博客中感觉Endpoint和ABC非常的重要,要彻底的理解,并且binding应该知道在什么情况用什么binding性能最高,最合适,以后再实战的情况下多多注意使用。