大家好,欢迎来到IT知识分享网。
一、什么是WCF?
.NET Framework 3.0 中开始引入一种专门用来构建分布式系统的API——WCF,与过去所有的其他分布式API(如DCOM,.NET Remoting,XML WebService,消息队列)有所不同,WCF提供统一的,可扩展的编程对象模型来使用以前多个分布式技术。
它是.NET 3.0 开始引入一种专门用来构建分布式系统的API。
前面我们学习了两种基于Web的服务:
1、Web Service
2、Web API
3、WCF
什么是分布式系统?
分布式系统主要用于负载均衡,降低服务器的压力。就是对外是一个系统,但是实际上是将系统分别运行到不同的服务器上。
二、WCF体系框架
WCF统一了微软公司之前推出的多种分布式技术,其中包括:
- Web Service和WSE。
- .Net Remoting。
- .Net 企业服务。
- 微软消息队列(MSMQ)。
WCF的体系基本包含了4个方面,分别为契约、服务运行时、消息和寄宿。
1、契约(描述该服务的功能和作用,解释了该服务是做什么的)
契约的定义描述了该服务的功能和作用,它告诉SOA系统中的其它节点这个服务是“做什么”的。
2、服务运行时 (定义服务时的具体行为,描述服务时怎么做的)
服务运行时定义了服务在运行时的具体行为。如果说契约描述了服务是“做什么”的,那么服务运行时就在一定程度上描述了服务是“怎么做”的。
3、消息(消息的传输方式,消息的编码与解码)
消息方面包含了消息的传输方式、消息的编码与解码。
4、激活和宿主
激活和宿主属于WCF程序的部署方式。一个WCF服务需要在一个可运行的程序中寄宿,我们可以把宿主理解为WCF运行的容器。常用的寄宿方式包括自寄宿、IIS寄宿、Windows激活服务、Windows服务、Com+组件等。
三、WCF基础概念介绍
1、地址(Address)
在WCF框架中,每个服务都具有唯一的地址。在SOA系统中,其它服务和客户端通过服务的地址来对服务进行访问。
http://localhost /Service net.tcp://dc3web1:9023/MyService net.msmq://localhost/MyMsMqService 实际上地址的形式不止这些,它们的构成形式如下所示: http://[Hostname]:[Port]/[ServiceAddress] https://[Hostname]:[Port]/[ServiceAddress] net.tcp://[Hostname]:[Port]/[ServiceAddress]
2、绑定(Binding)
绑定定义了服务与外部通信的方式。它由一组称为绑定元素的元素而构成,这些元素组合在一起形成通信基础结构。一个绑定可以包含以下内容。
- 通信所使用的协议,如HTTP、TCP、P2P等。(什么样的协议通讯)
- 消息编码方式,如纯文本、二进制编码、MTOM等。(通信的方式)
- 消息安全保障策略。(保障消息不被窃取)
- 通信堆栈的其它任何要素。(其他要素)
3、契约(Contract)
1、服务契约[ServiceContract]
服务契约将多个相关的操作联系在一起,组成单个功能单元。
不需要关心单元的细节,只需要关心单元的使用。
2、数据契约[DataContract]
数据类型的说明称为数据契约。服务使用的数据类型必须在元数据中进行描述,以使其它各方面可以与该服务进行交互操作。
3、错误契约[FaultContract]
错误类型的说明称为错误契约。
4、消息契约[MessageContract]
消息契约描述消息的格式。
4、终节点(EndPoint)
终结点是用来发送或接收消息(或同时执行这两种操作)的构造。一个终节点由三个要素组成,分别是笔者已经介绍了的:地址、绑定和契约。以SOA的思想来看,一个终节点就相当于服务的公共接口。
5、元数据
描述服务的特征,外部实体需要了解这些特征,服务公开的元数据包括有XML结构的文档(定义服务的数据协定)和WSDL文档(描述服务的方法)。
6、宿主
服务必须承载于某个进程中,宿主是控制服务的生存期的应用程序。
四、构建WCF服务
WCF示例:
1、创建“WCF服务库”,在菜单中选择“文件(F)”->“新建项目§…”打开新建项目对话框。在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”,如图7-1所示。在“名称”文本框中,填写我们要创建的WCF服务库的项目名称“WCF_HelloWorld”。
2、点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。
3、修改IService1.cs接口中的内容如下。WCF服务接口标记了[ServiceContract]特性,每个接口成员都标注[OperationContract]特性,服务接口中可以包含不标注特性的方法,这就表示该方法不会被WCF运行库公开。
[ServiceContract] public interface IService1 { [OperationContract] string HelloWorld(string name); }
4、修改Service1.cs类中的内容如下,继承IService1接口实现接口中定义的HelloWorld方法。
public class Service1 : IService1 { public string HelloWorld(string name) { return name + "说:HelloWord"; } }
5、点击启动按钮,或在菜单中选择“调试”->“启动调试F5”,启动WCF测试客户端。如图7-3所示。在窗口左侧显示我的服务项目相关信息,第一个行服务地址:
http://localhost:8733/Design_Time_Addresses/WCF_HelloWorld/Service1/mex
6、下面式具体的提供的服务,在窗口右侧显示的是服务的使用说明,描述了如何给WCF测试客户端添加新的服务地址,以及如何测试服务的流程步骤。
7、双击HelloWorld服务,可以显示服务请求界面,在名称name的值中填写内容,并调用HelloWorld服务。
8、调用后在响应窗口中显示返回值”Jack说:HelloWord”。
注意:
构建WCF服务类型时并不需要使用接口,可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的,但是使用接口会有很多好处,其中最大达好处就是可扩展性,灵活性很高,而且这也是目前流行的。
构建WCF服务类型并不需要使用接口。可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的。
虽然这种方式也可以构建WCF服务,但是显式方式定义一个接口类型来描述服务契约的好处很多。
例如接口可以应用到多个服务类型,这些服务类型可以是用多种语言和架构实现的,使用接口可以获得更大的灵活性,此外服务契约接口可以作为新契约的基础,可是实现接口继承的方式来扩展接口服务。
当前代码无法直接执行还需要修改App.config配置文件配合,在后续会介绍。
接口定义了规范,不定义实现。
[ServiceContract] public class Service1 //: IService1 { [OperationContract] public string HelloWorld(string name) { return name + "说:HelloWord"; } }
五、使用WCF数据契约实现模型数据交互
示例:
1、接上一个项目,在项目中添加一个类存储实体数据,命名为User。
定义服务契约将自定义类型作为参数或返回值时就需要使用WCF数据契约,对这些数据进行建模,数据契约是使用[DataContract]特性的类型,以及每一个需要作为契约一部分的属性也需要标记[DataMember],使用这个特性需要引用命名空间System.Runtime.Serialization
using System.Runtime.Serialization; [DataContract] //注意这里的类一定要是公开的 public class User { [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } }
2、在IService1接口中,添加两个WCF服务方法。
[ServiceContract] public interface IService1 { [OperationContract] string HelloWorld(string name); //添加用户名称和年龄 [OperationContract] void AddUser(string name, int age); //显示所有已经添加的用户 [OperationContract] List<User> GetUsers(); }
3、在Service1类中创建WCF服务方法,AddUser服务接收提交数据,保存到List集合中,GetUsers服务返回所有提交的用户集合,给Service1类加上特征设置InstanceContextMode.Single,表明当前服务为所有服务请求生成唯一服务对象,这样每个请求所访问的List集合就是公共的。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class Service1 : IService1 { List<User> list = new List<User>(); public string HelloWorld(string name) { return name + "说:HelloWord"; } public void AddUser(string name, int age) { list.Add(new User { Name = name, Age = age }); } public List<User> GetUsers() { return list; } }
运行效果:
AddUser:服务提交数据
GetUsers:服务获取所有用户数据
六、实战演练——创建新闻查询WCF服务
1、任务目标:
- 创建WCF服务实现添加新闻数据
- 创建WCF服务实现新闻标题查询
2、需求说明
- 连接新闻数据库实现添加新闻数据服务。
- 连接新闻数据库实现新闻标题查询。
3、实现思路
- 创建WCF服务库。
- 添加LINQ to SQL类,链接数据库,添加News表到LINQ to SQL类中。
- 编写WCF服务接口IService.cs。
- 编写WCF服务Service.cs。
- 启动WCF客户端工具测试服务。
[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: 在此添加您的服务操作 [OperationContract] void addNews(string title, string content, int categoryid); [OperationContract] List<News> GetNews(string key); [OperationContract] List<News> GetNewsByAll(); [OperationContract] void DeleteNewsByNewsID(int id); [OperationContract] void ModifyNewsByNewsId(int id, string title, string content, int CategoryID); }
public class Service1 : IService1 { NewsDataContext db = new NewsDataContext(); public string GetData(int value) { return string.Format("You entered: {0}", value); } public void addNews(string title,string content,int categoryid) { News news = new News(); news.Title = title; news.Content = content; news.CategoryID = categoryid; db.News.InsertOnSubmit(news); db.SubmitChanges(); } public List<News> GetNews(string key) { return db.News.Where(m => m.Title.Contains(key)).ToList(); } public List<News> GetNewsByAll() { return db.News.ToList(); } public void DeleteNewsByNewsID(int id) { News news = db.News.Where(m => m.NewsID == id).FirstOrDefault(); db.News.DeleteOnSubmit(news); db.SubmitChanges(); } public void ModifyNewsByNewsId(int id, string title, string content, int CategoryID) { News news = db.News.Where(i => i.NewsID == id).FirstOrDefault(); news.Title = title; news.Content = content; news.CategoryID = CategoryID; db.SubmitChanges(); } }
AddNews:添加新闻数据
GetNews:新闻标题查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A62RriE1-28)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-.png)]
GetNewsByAll:获取所有新闻
DeleteNewsByNewsID:根据ID删除新闻
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcaaXqAu-30)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-.png)]
ModifyNewsByNewsId:修改新闻数据
七、小结
- 本小结中我们学习了WCF是一种用来构建分布式系统的API。
- WCF为程序员提供了丰富的功能,其中包括:托管、服务实例管理、异步、安全、事务管理、离线队列等。
- WCF的体系框架包含了4个方面,分别为契约、服务运行时、消息和寄宿。
- 构建WCF服务类型并不需要使用接口。可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的。但是使用接口可以获得更大的灵活性。
- 构建WCF服务类型时并不需要使用接口,可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的,但是使用接口会有很多好处,其中最大达好处就是可扩展性,灵活性很高,而且这也是目前流行的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126285.html