WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型,是建立在消息通信这一概念基础上运行的一个运行时服务系统。
WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务端和WCF客户端。该编程模型封装在.NET框架的System.SericeModel命名空间中。
利用WCF,开发人员不再根据不同的需求分别选择不同的模型,而是只用一种模型,就可以用统一的格式和用法编写各种网络应用程序,从而构建安全的,可靠的,跨平台(包括Windows平台和非Windows平台)的分布式解决方案。
一 WCF示例
1 创建服务端项目和客户端项目
一般为了方便调试和观察,一般在同一个解决方案中既包括WCF服务端应用程序项目,也包括客户端应用程序项目。但是,在实际的项目开发中,由于用【WCF服务应用程序】模板创建的服务是通过IIS单独部署的,所以应分别用不同的解决方案来实现。
(1)选择【WPF应用程序】模板,新建一个客户端应用程序项目。解决方案名WcfServiceTest,项目名为Client。
(2)创建服务端
在【解决方案管理器】中,右键单击解决方案名,选择【添加】-->【新建项目】,在弹出的窗口中选择【WCF服务应用程序】模板,单击【确定】,此时系统会自动添加对System.ServiceModel命名空间的引用,并自动在该项目中生成一下文件。
-
-
- IService.cs:用接口定义服务协定和数据协定
- Service.svc和Service.svc.cs:实现IService1接口中声明的服务操作
- Web.config:服务器端配合文件,用于定义服务行为以及绑定的协议等
-
(3)添加新服务(可选)
如果不希望使用默认的WCF服务Service1,可以利用【重构】将其替换成其他名称,或者删除IService.cs,IService.svc,IService.svc.cs,然后按照下面的方法创建或添加新服务。右击项目名,选择【添加】-->【WCF服务】命令,在弹出的窗口中将【项名称】改为新的WCF服务名称,单击【确定】按钮。
2 编写服务端代码
此部分的主要工作就是设计和实现协定,包括服务协定,数据协定以及消息协定。
服务协定用ServiceContract特性来声明,用接口来定义。在借口内部,用方法及其参数声明服务提供的操作,在接口中声明的这些方法统称为“操作方法”。注意在服务协定中只能声明操作方法,不允许声明属性和字段。
(1)定义接口(IService.cs)
[ServiceContract] public interface IService1 { // TODO: 在此添加您的服务操作 [OperationContract] string SayHello(string name); [OperationContract] double Add(double d1, double d2); [OperationContract] double Divide(double d1, double d2); }
(2)实现接口声明的操作方法(Service.svc.cs)
public class Service1 : IService1 { public string SayHello(string name) { return string.Format("Hello, {0}", name); } public double Add(double d1, double d2) { return d1 + d2; } public double Divide(double d1, double d2) { return d1 / d2; } }
代码编写完毕后,右键单击WcfService项目名,选择【生成】或【重新生成】,以确保没有语法错误。
3 修改服务端配置
(1)修改绑定配置(Web.config)文件,找到protocolMapping配置节,在其上方添加以下代码:
<bindings> <basicHttpBinding> <binding name ="b1" transferMode ="Buffered" textEncoding="utf-8" messageEncoding ="Text"> <security mode="None" /> </binding> </basicHttpBinding> </bindings>
将protocolMapping配置节的代码改为一下内容:
<protocolMapping> <add binding="basicHttpBinding" scheme="http"/> </protocolMapping>
在protocolMapping配置节的下方添加以下代码:
<services> <service name="WcfService1.Service1"> <endpoint binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService1.IService1" /> </service> </services>
(2)开通调试功能
在Web.config中找到includeExceptionDetailInFaults,将其改为true。
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> <serviceDebug includeExceptionDetailInFaults="true"/>
4 测试服务(可选)
用【WCF应用程序】模板创建WCF服务后,如果需要,可以直接利用【WCF测试客户端】来测试每个服务操作。
右击WcfService文件名,选择【设为启动项目】命令,并选中要测试的Service.svc文件名(测试那个服务就选中哪个.svc文件),然后按<F5>调试运行,此时系统会自动弹出WCF测试客户端。
测试结束后,要再将WPF应用程序设为启动项目。
5 在服务端添加引用
(1)确保服务已经启动
单击WcfService项目,选择【生成】或【重新生成】,若WCF服务没有启动,则会失败。
(2)查找引用的服务
单击Client项目中的【引用】-->【添加服务引用】,在弹出的对话框中,单击【发现】,此时会自动找到与该项目在同一个解决方案中俄的WCF服务
(3)生成客户端代码
using Client.ServiceReference1;
private void btn1_Click(object sender, RoutedEventArgs e) { textBlock1.Text = "客户端调用sayhello方法,服务端返回:\n"; //创建服务客户端 Service1Client client = new Service1Client(); //调用服务 string s = client.SayHello("欢迎学习WCF!"); //关闭服务客户端并清理资源 client.Close(); textBlock1.Text += s; }