【前言】
这篇博客仍然是关于WCF的创建学习。上篇博客中使用的是在服务端的HOST中写入终结点的配置,这次采用配置
文件的方式进一步进行解耦。在配置文件中运用到了<system.serviceModel>的配置属性。它是专门为分布式服务的
一种配置方式。在它的<service>、<endpoint>、<behaviors>这三个属性中发布服务端的实现地址、发布地址、绑定
方式、服务端对外接口。
【实现思路】
在项目中新建项目,添加服务的类库[WCFServiceDemo],类库中添加对外的总的接口类[IHelloService]。
在项目中新建项目,添加web窗体[WinformHello]和类[HelloService](用于实现接口)。
在WinformHello 中添加XML的APP.Config,用于添加配置信息。
将web窗体运行,激活,开启服务后,就可以显示发布的服务信息了。
代码:
WCFServiceDemo:
IHelloService: 需要引用 System.ServiceModel
<pre name="code" class="html"><span style="font-family:SimSun;font-size:18px;">using System.ServiceModel; namespace WCFServiceDemo { //声明服务契约 [ServiceContract] public interface IHelloService { //在服务中添加方法或者提供的服务 [OperationContract] DateTime getDateTime(); [OperationContract] String getUserInfo(); } }</span>
WinformHello :
app.config:
<span style="font-family:SimSun;font-size:18px;"><?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <!--name属性表示实现服务的命名空间.类;--> <service name="WinformHello.HelloService" behaviorConfiguration="TestBeahavior" > <host> <baseAddresses> <!--手动添加发布地址,本地发布--> <add baseAddress = "http://localhost:8080/Hello"/> </baseAddresses> </host> <!--表名绑定方式,和服务端被实现的总接口(服务)--> <endpoint address="" binding="basicHttpBinding" contract="WCFServiceDemo.IHelloService"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="TestBeahavior"> <!--配置信息可见--> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration></span>
HelloService:需要引入需要被实现的接口的命名空间,并实现。
<span style="font-family:SimSun;font-size:18px;">using WCFServiceDemo; namespace WinformHello { public class HelloService : WCFServiceDemo.IHelloService { public DateTime getDateTime() { return DateTime.Now; } public string getUserInfo() { return "猴年过完是鸡年,鸡年过完是狗年!"; } } }</span>
宿主窗体:
对应代码:
<span style="font-family:SimSun;font-size:18px;"> ServiceHost host = null; private void button1_Click(object sender,EventArgs e) { host = new ServiceHost(typeof(WinformHello.HelloService)); host.Open(); label1.Text = "服务已经启动"; } </span>
实现效果:
运行窗体,启动服务:
查看发布的服务信息URL:
在App.confg中直接访问地址就行。
查看发布的服务信息:
<system.serviceModel>:
配置信息:
元素 |
说明 |
behaviors |
此元素定义名为 endpointBehaviors 和 serviceBehaviors 的两个子集合。 每个集合分别定义终结点和服务所使用的行为元素。 每个行为元素由其唯一的 name 属性标识。 |
Bingdings |
|
Client |
此元素包含客户端用来连接到服务的终结点的列表。 |
ComContracts |
此节定义支持 WCF 和 COM 互操作的 COM 协定。 |
commonBehaviors |
此元素只能在 machine.config 文件中定义。 它定义了名为 endpointBehaviors 和 serviceBehaviors 的两个子集合。 每个集合分别定义计算机上所有 WCF 终结点和服务所使用的行为元素。 如果同时在 <commonBehaviors> 和 <behaviors> 节中定义了某个行为,则 <behaviors> 节中的行为优先。 |
diagnostics |
此元素包含 WCF 的诊断功能设置。 用户可以启用/禁用跟踪、性能计数器和 WMI 提供程序,还可以添加自定义消息筛选器。 |
extensions |
|
protocolMapping |
|
serviceHostingEnvironment |
此元素定义服务宿主环境要为特定 传输实例化的类型。 如果此节为空,则使用默认类型。 |
comContracts |
此元素定义支持 WCF 和 COM 互操作的 COM 协定。 |
StandardEndpoints |
此节定义一个标准终结点集合,这些终结点是预配置的可重用终结点。标准终结点具有一个或多个设置为固定值的地址、绑定和协定特性。例如,发现终结点具有固定的协定。此外,还可以使用标准终结点用新属性扩展服务终结点,这与定义自定义绑定相似。 |
备注:
WCF 不会向其他产品的配置节中添加元素。
WCF 服务是在配置文件的 services 节中定义的。程序集可以包含任意多个服务。每个服务都有自己的 service
配置节。本节及其内容定义特定服务的服务协定、行为和终结点。
只有服务的 name 属性是必需的。默认情况下,服务的名称描述用于实现服务的基础 CLR 类型;但是,您可以
更改 ServiceContractAttribute 上的 ConfigurationName 属性以重写 CLR 类型要求。
behaviorConfiguration 属性是可选项。它标识服务所使用的服务行为。此特性指定的行为必须链接到同一配置
每个服务将公开 endpoint 元素中定义的一个或多个终结点。每个终结点都具有自己的地址和绑定。配置文件中
使用的所有绑定都必须在该文件的范围内定义。
绑定通过 name 和 bindingConfiguration 属性的组合链接到终结点。 binding 属性定义在哪个节中定义绑
定。 bindingConfiguration 属性定义使用绑定节中的哪个已配置绑定。绑定节可以定义若干个已配置的绑定。
总结:
这个Demo的实现没有使用WCF的封装好的框架进行搭建,而是采用日常的VS项目进行,这样可以体会到如何创建
的分布式服务的精髓,VS自带的WCF框架其实也就是把这些封装了一下,从根上了解它的创建过程,有利于我们在使
用封装框架时游刃有余。
在配置文件中声明了要被实现的接口和实现接口的类。对<system.serviceModel>的学习和理解是关键点。