WCF 详解

article/2025/10/5 16:10:21

一、什么是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-1616160593528)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-20200426105950759.png)]

GetNewsByAll:获取所有新闻

image-20200426110909376

DeleteNewsByNewsID:根据ID删除新闻

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

ModifyNewsByNewsId:修改新闻数据

image-20200426111807348

七、小结

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

http://chatgpt.dhexx.cn/article/IrEcEuv3.shtml

相关文章

Windows内核原理与实现之 GDI (图形设备接口)

文章摘录自《Windows内核原理与实现》一书。 图形用户界面是 Windows 操作系统的重要特色&#xff0c;这也是在 Windows 子系统中提供的。概括而言&#xff0c;Windows 的图形系统有两方面特点&#xff1a;首先&#xff0c;它提供了一套与设备无关的编程接口&#xff0c;即 G…

windows 驱动与内核调试 学习

概述 本文讲述笔者在学习内核和驱动开发的笔记。 驱动概述 一般驱动需要运行内核权限下运行(因为涉及硬件读取)&#xff0c;比如Intel下的ring 0 权限下。在windwos大量病毒和杀软为了特殊目的往往都是通过将自身升级为内核驱动方式进行运作。如果病毒程序首先进入ring 0理论…

Windows内核--CPU和内核(1.7)

Windows内核支援哪些CPU? Intel x86/x86_64 IA64已不再支持. AMD amd64 ARM (Windows On Arm: WOA) ARM具备低功耗优势, 除了高通, 还有Broadcom/NXP等都支援ARM架构. 苹果自研M系列开了头&#xff0c;ARM不仅有低功耗&#xff0c;同样有性能&#xff0c;Windows也想分一杯羹…

windows内核驱动

内核&驱动基础 WDK(Windows Driver Kit) 内核编程需要使用WDK WDK 下载 windows xp wdk 下载地址 WDK 安装 勾选所有的安装项,避免错过一些例子 默认安装目录: C:\WinDDKfirst驱动开发 源码 first.c #include <ntddk.h>#define DEBUG/** 卸载函数*/ VOID Driver…

Windows 内核会换为 Linux 吗?

关注、星标公众号&#xff0c;不错过精彩内容 来源&#xff1a;网络 编辑整理&#xff1a;strongerHuang 如果装个纯linux&#xff0c;则一些windows软件没法用。如果用windows然后装个虚拟机&#xff0c;在虚拟机上安装linux&#xff0c;又感觉麻烦而且占用电脑资源。 现在win…

Windows内核之系统架构

一.架构概述 下图显示了Windows的基本结构。Windows采用双模式来保护操作系统本身&#xff0c;以避免被应用程序的错误所波及。操作系统核心运行在内核模式下&#xff0c;应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块&#xff08;内核驱动程…

Windows内核原理与实现之Windows设备驱动程序

文章摘录自《Windows内核原理与实现》一书。 设备驱动程序是操纵设备的内核模块&#xff0c;I/O 管理器、即插即用管理器和电源管理器都需要与设备的驱动程序打交道。 在Windows I/O 系统中&#xff0c;设备驱动程序不仅为操作系统提供了支持各种 I/O 设备的能力&#xff0c;…

Windows内核的基本概念

Windows内核的基本概念 1 处理器模式 Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode)&#xff1b;3 表示用户模式(user mode)。 1.1 内存管理 Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的&#xff0c;为系…

Windows内核--源代码在哪里?(1.1)

大部分人能看到这篇帖子, 想必已经用过Windows系统多年了... 微软官方并不完全公开源代码 想清楚Windows技术内幕&#xff0c;就需要逆向工具。幸运的是: WRK源代码(Windows Research Kernel) (XP/Server 2003)Windows 2000源代码(Kernel和用户层) 深入解析Windows操作系统(最…

windows内核驱动开发(WDK环境搭建)

去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了。 下面直接下载步骤二和步骤三的SDK和WDK。 SDK下载地址 WDK下载地址 注意下载的SDK和WDK版本需要统…

Windows内核--子系统(3.5)

到底什么是子系统? 子系统是用户层概念。在Windows内核之上&#xff0c;如果想要执行类UNIX应用程序&#xff0c;就是POSIX子系统&#xff0c;如果要类似OS/2环境&#xff0c;就是OS/2子系统。 如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。 对于W…

无法正常进入Windows也能开启Windows内核调试

1 背景 Windows的启动的早期阶段&#xff0c;大致分为3步&#xff1a;bootmgr&#xff0c;winload&#xff0c;nt内核加载。 下图是Winload阶段的一个报错。 如果出现Windowslogo&#xff0c;一般就是进入nt内核加载了。 我们经常开的调试功能是nt内核加载后的调试。无法调试…

windows内核开发学习笔记二十四:windows内核架构

从上图上可以看出&#xff0c;windows内核主要层次划分为三个层次&#xff0c;以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层&#xff08;Hardware Abstraction Layer&#xff0c;简称HAL&#xff09;&#xff1a;主要是把所有与硬件相关联的代码隔…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间&#xff0c;这样会增大内核风险。相反&#xff0c;内核抽象出Handle给用户态&#xff0c;不管是文件、进程、线程等对象&#xff0c;通过Handle可以隐藏内核细节&#xff0c;统…

Windows内核基础之权限级别

权限级别是CPU中的一个概念&#xff0c;CPU中包含4个权限级别&#xff0c;分别是0环&#xff0c;1环&#xff0c;2环&#xff0c;3环&#xff0c;CPU设计制造商最初希望0环用于运行内核&#xff0c;1环和2环运行设备驱动&#xff0c;3环运行应用程序&#xff0c;但是系统设计者…

Windows内核--调试内核源代码(1.5)

Kernel编译和普通应用程序编译有差异吗&#xff1f; 最终Kernel二进制档是给CPU执行的&#xff0c;只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可&#xff0c;从编译角度&#xff0c;内核和应用程序无差别。Windows内核是exe文件。 内核与用户应用程序运行环境有…

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址&#xff0c;还需附加GU…

Windows内核编程(二)-第一个内核程序

第一个内核程序 通过 Visual Studio新建工程 注意事项&#xff1a; 大部分widnows驱动程序都是内核驱动(Kernel Driver)&#xff0c;所以本笔记不分"驱动程序"与"内核编程"&#xff0c;也不区分"内核模块"(Kernel Module)、“驱动程序”(Drive…

Windows内核原理与实现之Windows研究内核(WRK)

Windows并非一个开放源码的操作系统&#xff0c;但正如上一章所提&#xff0c;Microsoft开放了一份以Windows XP x64和Windows Server 2003 SP1为基础的内核源代码&#xff0c;它可以编译和运行&#xff0c;作为教育科研机构的教学实践和研究的平台使用&#xff0c;称为WRK&…

Windows内核结构

Windows内核结构 第一篇博客&#xff0c;随便写下练练手:) Windows内核总共分为三层&#xff1a; 与硬件直接打交道的这一层叫做硬件抽象层简称HAL&#xff0c;这一层的用意就是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中&#xff0c;从而做到尽可能的独立于硬件平…