WCF 详解

WCF 详解WCF 详解一 什么是 WCF NETFramework 0 中开始引入一种专门用来构建分布式系统的 API WCF 与过去所有的其他分布式 API 如 DCOM NETRemoting

大家好,欢迎来到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统一了微软公司之前推出的多种分布式技术,其中包括:

  1. Web Service和WSE。
  2. .Net Remoting。
  3. .Net 企业服务。
  4. 微软消息队列(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”。

image-20200423181557127

​ 2、点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。

image-20200423181641109

​ 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测试客户端添加新的服务地址,以及如何测试服务的流程步骤。

image-20200423181932697

​ 7、双击HelloWorld服务,可以显示服务请求界面,在名称name的值中填写内容,并调用HelloWorld服务。

image-20200423182020436

8、调用后在响应窗口中显示返回值”Jack说:HelloWord”。

image-20200423182049448

注意:

构建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:服务提交数据

image-20200426103424975

GetUsers:服务获取所有用户数据

image-20200426103512677

六、实战演练——创建新闻查询WCF服务

1、任务目标:

  • 创建WCF服务实现添加新闻数据
  • 创建WCF服务实现新闻标题查询

2、需求说明

  • 连接新闻数据库实现添加新闻数据服务。
  • 连接新闻数据库实现新闻标题查询。

3、实现思路

  1. 创建WCF服务库。
  2. 添加LINQ to SQL类,链接数据库,添加News表到LINQ to SQL类中。
  3. 编写WCF服务接口IService.cs。
  4. 编写WCF服务Service.cs。
  5. 启动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:添加新闻数据

image-20200426105911482

GetNews:新闻标题查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A62RriE1-28)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-.png)]

GetNewsByAll:获取所有新闻

image-20200426110909376

DeleteNewsByNewsID:根据ID删除新闻

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcaaXqAu-30)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-.png)]

ModifyNewsByNewsId:修改新闻数据

image-20200426111807348

七、小结

  • 本小结中我们学习了WCF是一种用来构建分布式系统的API。
  • WCF为程序员提供了丰富的功能,其中包括:托管、服务实例管理、异步、安全、事务管理、离线队列等。
  • WCF的体系框架包含了4个方面,分别为契约、服务运行时、消息和寄宿。
  • 构建WCF服务类型并不需要使用接口。可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的。但是使用接口可以获得更大的灵活性。
  • 构建WCF服务类型时并不需要使用接口,可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的,但是使用接口会有很多好处,其中最大达好处就是可扩展性,灵活性很高,而且这也是目前流行的。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126285.html

(0)
上一篇 2025-09-19 22:15
下一篇 2025-09-19 22:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信