一、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="",Name="张三",Department=".NET部",Grade=""},
new Employee(){Id="",Name="李四",Department="JAVA部",Grade=""},
new Employee(){Id="",Name="王五",Department="PHP部",Grade=""},
};
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请求的内容。

WCF学习笔记(基于REST规则方式)的更多相关文章

  1. Vue学习笔记-基于CDN引入方式简单前后端分离项目学习(Vue+Element+Axios)

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  2. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  3. WCF学习笔记之传输安全

    WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...

  4. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  5. WCF 学习笔记之双工实现

    WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...

  6. Linux学习笔记——基于鸟哥的Linux私房菜

    Linux学习笔记--基于鸟哥的Linux私房菜 ***** ARM与嵌入式linux的入门建议 (1) 学习基本的裸机编程:ARM7或ARM9,理解硬件架构和控制原理 (这一步是绝对的根基) (2) ...

  7. WCF学习笔记一

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...

  8. WCF学习笔记之WCF初识

    这篇博客将介绍WCF的最基础内容,让我们对WCF有一个基本的认识.后续的博客中将会介绍WCF其他方面内容.本篇博客将通过一个简单的例子,介绍如何创建WCF服务,并承载这个服务,让客户端来访问它.下面请 ...

  9. WCF学习笔记(一)

    WCF是什么? 官方解释: Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至 ...

随机推荐

  1. 在Image控件中绘制文字

    //Canvas 在Image控件中绘制文字 procedure TForm1.Button1Click(Sender: TObject);begin  image1.Canvas.Font.Size ...

  2. hdu 4104

    先排序,再动态规划.须要优化 #include<iostream> #include<cstdio> #include<cstring> #include<s ...

  3. OpenCV 显示Mat矩阵异常 显示“程序停止工作” 解决办法

    笔者调试OpenCV 程序时,在使用标准输出显示Mat矩阵时,编译没有错误,但每次运行都弹出程序停止工作的对话框.google之,得到解决方案. 程序如下: #include <iostream ...

  4. JFinal之学习资源

    JFinal官网: http://www.jfinal.com/ JFinal在线API: http://tool.oschina.net/apidocs/apidoc?api=jfinal JFin ...

  5. [001]const和指针

    很经典的: const int* p: int* const p: 前者表示指针指向的值是const,指向的值不可变,但是指针本身是可变的:后者表示改指针是const,指针不可变,但是指向的值是可变的 ...

  6. Requirements

    Requirements The framework requirements are limited. PHP 5.5 or greater. Apache Web Server or equiva ...

  7. Day03 - Python 函数

    1. 函数简介 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print():也可以自己创建函数,这 ...

  8. servlet 容器,工作原理,优缺点

    转自http://blog.sina.com.cn/s/blog_b5a157500101ld71.html servlet:是以java技术为基础,应用于服务器端的程序组件,本质就是java代码,用 ...

  9. 【转载】Java的四种引用

    在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引 ...

  10. java集合总结

    java中集合是很重要的一点,巩固这边学习的知识,把知识理一下 按马士兵的视频,总结的也很好,集合就是一个“1136” 1个图,1个类Collections,3个知识点:增强for循环,泛型,打包和解 ...