一、WCF的定义

WCF是.NET 3.0后开始引入的新技术,意为基于windows平台的通讯服务。

首先在学习WCF之前,我们也知道他其实是加强版的一个面向服务(SOA)的框架技术。

如果熟悉WebService就会知道WebService是基于XML+XSD,SOAP和WSDL三大技术,当然他也是采用HTTP协议的通信,严格来说WebService是一种面向服务开发的标准。而ASP.NET WebService则是微软平台下的服务。

WCF其实一定程度上就是ASP.NET Web Service,因为它支持Web Service的行业标准和核心协议。官方的说法WCF它整合了.Net平台下所有的和分布式系统有关的技术,如Enterprise Sevices(COM+).Net Remoting、Web Service(ASMX)、WSE3.0和MSMQ消息队列。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。

WCF可以实现WebService的功能,即WCF实现了对SOAP的直接支持。然后WCF也支持基于REST协议的通信,REST严格说不是一个协议,但是定义了使用服务访问资源的几条规则。支持REST的Web服务是基于HTTP协议和REST规则的简单服务。

REST规则按照3个类别来定义,1.可以用简单的URI访问的服务,2.支持MIME类型,3.使用不同的HTTP方法。支持MIME类型,就可以从服务中返回不同的数据格式,如普通的XML、JSON等。

REST规则是基于HTTP请求的四个方法的:GET()方法--从服务中返回数据,POST()方法--创建一个新的数据源,PUT()方法--更新服务端,DELETE()方法--删除数据资源。

二、WCF项目实例

1)首先我们定义服务契约,建立一个类库项目Service.Interface,其要引用的链接库如下:

然后定义了一个数据契约类Employee.cs,注意此处的几个特定特性的写法,这些特性也就规定了他是一个数据契约类,数据契约类是为其他的契约提供数据支持的基本类。

然后是创建一个服务契约接口类IEmployeesService.cs,和基于SOAP的服务契约定义不同,我们无需在相应的操作方法上面应用OperationContractAttribute特性,但是应用在接口/类上的ServiceContractAttribute特性仍是必需的。在这里替换OperationContractAttribute特性的分别是WebGetAttribute和WebInvokeAttribute,它们均定义在System.ServiceModel.Web程序集中。

2)创建寄宿服务,添加一个控制台程序Service

其中在控制台程序Service中我们定义了如下一个实现了契约接口IEmployeesService的服务类型EmployeesService。

 public class EmployeesService : IEmployeesService{private static IList<Employee> list = new List<Employee>(){new Employee(){Id="001",Name="张三",Department=".NET部",Grade="1"},new Employee(){Id="002",Name="李四",Department="JAVA部",Grade="2"},new Employee(){Id="003",Name="王五",Department="PHP部",Grade="3"},};public IEnumerable<Employee> GetAll(){return list;}public Employee Get(string id){Employee employee = list.FirstOrDefault(e => e.Id == id);if (employee == null){//提示没有找到
            }return employee;}public void Create(Employee employee){list.Add(employee);}public void Update(Employee employee){this.Delete(employee.Id);list.Add(employee);}public void Delete(string id){Employee employee = this.Get(id);if (employee != null){list.Remove(employee);}}}
}

接下来我们在App.config中通过自我寄宿的方式对上面定义的EmployeesService服务进行寄宿,下面是相应的配置。我们为寄宿的服务添加了唯一一个终结点,并简单地指定了其ABC三要素。和我们之前配置的终结点不同的是,在这里我们采用的绑定类型为WebHttpBinding。

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><system.serviceModel><services><service name="Service.EmployeesService"><endpoint address="http://127.0.0.1:123/employees"binding="webHttpBinding"contract="Service.Interface.IEmployeesService"/></service></services></system.serviceModel>
</configuration>

  最终我们通过如下的程序进行服务的寄宿。之前我们总是使用基于服务类型创建的ServiceHost进行服务寄宿,在这里我们使用的是ServiceHost它的子类WebServiceHost

3)服务的调用

由于我们寄宿的服务完全是基于Web的,所以和普通的Web站点没有本质的区别。由于EmployeesService服务的GetAll和Get操作支持HTTP-GET请求,所以我们完全可以在浏览器中针对操作的地址发起请求,而返回的数据可以直接显示在浏览器上。下图所示的是通过浏览器调用GetAll操作(http://127.0.0.1:123/employees/all)得到的结果,我们可以看到所有员工的列表以XML的形式返回,当然前提是先启动Service程序再在浏览器访问数据:

注意:如果你的系统是Win7,如果运行Service程序的时候报了HTTP无法注册URL进程的错误,此处需要用管理员权限运行Visual Studio工具。

我们也可以通过浏览器调用Get操作并直接通过在地址中指定员工的ID(http://127.0.0.1:123/employees/001)并得到以XML表示的基于相应员工的信息。下图所示XML正式ID为001的Employee对象序列化后的结果。

上面我们演示了通过浏览器以HTTP-GET方式请求操作地址的方式从而直接将返回结果呈现出来,现在我们来演示如何使用通过ChannelFactory<TChannel>创建的服务代理进行服务调用。

新建一个控制台程序Client:

配置App.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><system.serviceModel><behaviors><endpointBehaviors><behavior name="webBehavior"><webHttp /></behavior></endpointBehaviors></behaviors><client><endpoint name="Service.EmployeesService"address="http://127.0.0.1:123/employees"behaviorConfiguration="webBehavior"binding="webHttpBinding"contract="Service.Interface.IEmployeesService"/></client></system.serviceModel>
</configuration>

  如上面的配置片断所示,我们定义了一个与服务端相匹配的客户端终结点,该终结点上应用了一个WebHttpBehavior终结点行为。WebHttpBehavior可以说是整个Web HTTP编程模型的核心,绝大部分针对Web的支持都是通过该行为实现的。实际上服务端终结点通过WebServiceHost应用了这个终结点行为。

最后是调用:

static void Main(string[] args){using (ChannelFactory<IEmployeesService> channelFactory = new ChannelFactory<IEmployeesService>("Service.EmployeesService")){IEmployeesService proxy = channelFactory.CreateChannel();Console.WriteLine("所有员工列表:");Array.ForEach<Employee>(proxy.GetAll().ToArray(), employee => Console.WriteLine(employee));Console.WriteLine("\n添加一个新员工(004):");proxy.Create(new Employee{Id = "004",Name = "赵六",Grade = "G9",Department = "行政部"});Array.ForEach<Employee>(proxy.GetAll().ToArray(), employee => Console.WriteLine(employee));Console.WriteLine("\n修改员工(004)信息:");proxy.Update(new Employee{Id = "004",Name = "赵六2",Grade = "G11",Department = "销售部"});Array.ForEach<Employee>(proxy.GetAll().ToArray(), employee => Console.WriteLine(employee));Console.WriteLine("\n删除员工(004)信息:");proxy.Delete("004");Array.ForEach<Employee>(proxy.GetAll().ToArray(), employee => Console.WriteLine(employee));Console.Read();}}

  

从编程角度来看,我们采用与SOAP服务完全一样的服务调用方式,那么如何反映出服务调用基于Web的本质呢?首先,之前我们能够通过浏览器访问GetAll和Get两个操作可以证明这两个服务操作是基于HTTP-GET的,返回的数据直接以单纯的XML返回,并没有封装成SOAP。为了证明Create、Update和Delete也是完全基于Web的,我们可以通过Fiddler来分析HTTP请求的内容。

转载于:https://www.cnblogs.com/yk123/p/4634653.html

WCF学习笔记(基于REST规则方式)相关推荐

  1. 嵌入式学习笔记——基于Cortex-M的单片机介绍

    基于Cortex-M的单片机介绍 前言 1生产厂商及其产品线 1.1ARM单片机的产品线 1.2命名规则 作业1 2习单片机的资料准备 2.1STM32开发所需手册 2.1.1芯片的数据手册 芯片基本 ...

  2. WCF学习笔记(2)——独立WCF服务

    本文将建立一个silverlight与wcf通讯的简单实例,wcf服务将被独立出来,而不再寄放在Web中.以下是详细步骤: 新建Silverlight应用程序,名称WCFtest,在解决方案上右键添加 ...

  3. 数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一)

    数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一) 步骤: 1. 创建SILVERLIGHT应用程序 2. 创建LINQ TO SQL [注意序列化的问题 ...

  4. CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码

    CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码 WEB-HTTP协议 1-请求方式 2-302跳转 3.cookie 4.基础认证 5.响 ...

  5. STM32学习笔记——基于正点原子例程编码器模式小结

    STM32学习笔记--基于正点原子例程编码器模式小结 最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解.STM32f4单片机提供编码器模式,以便 ...

  6. 激光slam学习笔记——基于图优化的激光slam方法

    激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...

  7. ASP.Net学习笔记004--基于ashx方式的ASP.Net开发1

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  8. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:07 规则式自然语言处理系统

    07 规则式自然语言处理系统 7.1 规则式系统 7.2 规则式系统的目的 7.2.1 为何需要规则式系统 7.2.2 使用规则式系统的应用 7.2.3 练习 7.2.4 开发规则式系统需要的资源 7 ...

  9. 学习笔记 | 基于FPGA的伪随机数发生器(附代码)

    今天给大侠带来在基于FPGA的伪随机数发生器,话不多说,上货. 今天是画师本人第一次和各位大侠见面,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考. 1 ...

最新文章

  1. 再见,Python!
  2. idea设置新增文件,自动添加到git
  3. 转载:谢谢原作者:块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动)
  4. Fiddler 学习笔记---命令、断点
  5. dropify,不错的图片上传预览插件
  6. 性能测试在软件测试中的位置,性能测试的响应时间,你真的算对了吗?
  7. 【机器学习】机器学习从零到掌握之三 -- 教你使用K近邻算法改进约会网站
  8. 防止误删的神器-ECS实例删除保护
  9. linux怎么给目录创建acl,LINUX-ACL文件访问控制列表
  10. perl linux 独立运行,Perl脚本打包为独立执行程序
  11. 本地事务和分布式事务区别
  12. (转载addone)完全使用Linux作为桌面系统 —— 使用Linux两年记 --软件列表
  13. 使用FlashBoot3.2c 将 U 盘制作成 DOS 启动盘
  14. python类方法重写和重载的区别_python 重载和重写的区别
  15. 微信亲戚备注分组名称_【微信分组备注名称大全】qq分组备注名称大全
  16. 一年中最后一个月的最后一天说说_2020年最后一个月的朋友圈说说句子
  17. 4412开发板项目实战-云服务器智能家居
  18. 网络连接有个感叹号的原因及解决方法
  19. springboot整合log4j2报错Unexpected filename extension of file[file__E__classes_log4j2.yml].Should be .xm
  20. 携程硅谷人才见面会邀请你参加!

热门文章

  1. 冠军奖30万!刘强东搞了个“猪脸识别”比赛,中美两地同时启动(附比赛详细日程及赛题说明)
  2. ThreadLocalRandom 安全吗
  3. 国产的markdown 语法的思维导图和大纲工具!
  4. 一个基于 Spring Boot 的项目骨架
  5. 用好 Git 和 SVN,轻松驾驭版本管理
  6. 50万高奖金!2022年第一场赛事来了
  7. 基于Adaboost算法的人脸检测分类器!
  8. 代码规范指南:怎样写才能干净整洁
  9. 机器学习最有价值的6个经验教训
  10. 斯坦福AI 5小时DNA测序破世界纪录!创人类新里程碑,成本仅3万