一、概述
往往在很多项目中数据库连接字符串、变量和一些动态的加载类会写在配置文件中。WCF也会在配置文件中写入一些配置参数,比如服务的地址、服务用于发送和接收消息的传输和消息编码等,通过配置文件可以灵活的修改,不需要再编译。
二、终结点Endpoint
首先我们需要了解WCF的一个概念就是终结点Endpoint,WCF服务通过定义一个或者多个终结点,当服务端和客户端的终结点相互匹配的时候才可以完成通信。终结点Endpoint由三部分组成Address、Binding和Contract。
Address:直译就是地址,相当于URL,通过地址可以访问到WCF的服务。
Binding:直译是绑定,绑定的是客户端和服务端底层的细节,比如传输的时候使用什么编码格式xml、text、二进制等。采用tcp还是http等等。
Contract:就是契约,规定我们那些服务接口可以访问,那些不能访问。暴露WCF服务的某些方法。
终结点的详细配置内容就是写在配置文件中,用于WCF实现多个应用程序之间的通信。
三、WCF配置文件的组成
WCF的配置详情都在<system.serviceModel>节点下,下面是配置文件的示例,配置的节点有点多,这里主要描述<services>、<bindings>和<behaviors>这三个。更加深入的内容可以详见MSDN文档。
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <behaviors> <!-- List of Behaviors --> </behaviors> <client> <!-- List of Endpoints --> </client> <diagnostics wmiProviderEnabled="false" performanceCountersEnabled="false" tracingEnabled="false"> </diagnostics> <serviceHostingEnvironment> <!-- List of entries --> </serviceHostingEnvironment> <comContracts> <!-- List of COM+ Contracts --> </comContracts> <services> <!-- List of Services --> </services> <bindings> <!-- List of Bindings --> </bindings> </system.serviceModel> </configuration>
1.<services>
该节点是必须有的,配置服务、接口和终结点。可以有多个service节点,每个service节点有name(服务的具体实现,格式应为 Namespace.Class.
)和behaviorConfiguration(一个字符串,其中包含要用于实例化服务的行为(behavior)的行为名),并且可以在service节点下存在多个终结点<endpoint>。具体实例如下:
<services> <service name="WcfServiceLibrary1.Service1"> <host> <baseAddresses> <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" /> </baseAddresses> </host> <!-- Service Endpoints --> <!-- 除非完全限定,否则地址将与上面提供的基址相关 --> <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1"> <!-- 部署时,应删除或替换下列标识元素,以反映 用来运行所部署服务的标识。删除之后,WCF 将 自动推断相应标识。 --> <identity> <dns value="localhost"/> </identity> </endpoint> <!-- Metadata Endpoints --> <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>
2.<bindings>
此节包含标准绑定和自定义绑定的集合。每一项都是一个可由其唯一 name 进行标识的 binding 元素。服务通过用 name 与绑定进行链接来使用绑定。绑定包含以下元素:
- 协议堆栈确定用于发送到终结点的消息的安全性、可靠性和上下文流设置。
- 传输确定将消息发送到终结点时使用的基础传输协议,例如 TCP 或 HTTP。
- 编码确定用于发送到终结点的消息的网络编码,例如,文本/XML、二进制或消息传输优化机制 (MTOM)。
因为绑定的内容节点非常多,详细的还是看详细文档,这里只举一个实例:
<mexHttpBinding> <binding closeTimeout="TimeSpan" name="string" openTimeout="TimeSpan" receiveTimeout="TimeSpan" sendTimeout="TimeSpan"> </binding> </mexHttpBinding>
3.<behaviors>
此元素定义名为 endpointBehaviors 和 serviceBehaviors 的两个子集合。每个集合分别定义终结点和服务所使用的行为元素。每个行为元素由其唯一的 name 特性标识。比如:是否允许客户端获得服务的元数据、路由修改、操作访问权限设置、服务的限制机制、服务请求的超时时间等。实例如下:
<behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors>
四、其他
新建一个WCF服务程序后会有一个Web.config文件有<system.serviceModel>配置节点,当一个控制台应用程序添加该服务引用后也会有App.config文件中也会有<system.serviceModel>节点。我们知道当服务端和客户端的终结点相互匹配的时候才可以完成通信,但是现在我们把服务端Web.config的<system.serviceModel>节点内容全部删除,然后将WCF应用服务程序发布到IIS上,之后还是可以在客户端成功访问该服务。这是因为IIS在默认监听http协议,那样就可以确定文件地址、绑定,找到了文件那接口契约什么的也都找得到了,所以这时候服务端配置文件不需要<system.serviceModel>也可以。
五、说明
这个随笔是我自己学习流程的一个记录,和大家共勉。