WCF服务/客户端

了解WCF 

1.准备工作

 >1.1 . XML
 >1.2 . Web Service
 >1.3 . 远程处理 (RPC)
 >1.4.  消息队列(MSMQ)
 >1.5.  面向服务的体系结构(SOA)

1.1 XML

因为以及有太多的先人指点, 关于XML的文章也是无数, 需要掌握XML的基本的一些概念: 可以访问  http://www.w3school.com.cn/

这里就简单的说明一下关于XML的一些基础的概念。XML(Extensible Markup Language,可扩展的标记语言)是一套用文本来定义语义标记的元标记语言,具有与平台无关、可灵活的定义数据和结构信息、便于网络传递等优势。XML特点 XML是文本编码,因此不受所选用的操作系统、对象模型和编程语言的影响,可在任何网络中正常传输。XML中的所有标记都是自定义的,通过这些自定义的标记,可描述某种数据的不同部分及其嵌套的层次结构。XML规定所有标记都必须有开始和结束标志。

引用W3C的一个简单的示例, 可以简单的了解XML的基础结构(如下图)

1.2 Web Service

Web Service也叫Web服务,根据数据交换格式的不同,Web Service又进一步分为XML Web Service和JSON Web Service等。
XML Web Service是一种以XML作为数据交换格式。 以JSON作为数据交换格式的Web服务称为JSON Web Service。

在Web Service的服务体系结构, 是由3个组成部分, 分别是:

1. 服务提供者  2. 服务请求者  3. 服务注册中心 

利用发布、发现、绑定的三个基本操作组成。

客户端与Web服务如何通信

1.客户端调用的web服务, 主要的过程:

(1) 客户端创建web服务的代理类的实例。

(2)通过调用代理类的具体的实现方法。

(3)客户端程序将服务所需要的参数序列化为SOAP消息, 然后通过网络发送到web服务器中。

(4)web服务器接受到SOAP消息 , 此时, 将消息反序列为XML格式, 同时创建web服务的实例, 调用Web服务提供的具体方法,将反序列化的XML作为参数传递到方法中。

(5)执行web服务提供的具体方法, 得到相应的返回值和一些消息参数。

(6)web服务器将返回值和一些消息参数序列化为SOAP消息, 然后通过网络返回到客户端的程序中。

(7)客户端接受到web服务器返回的SOAP消息, 将XML 反序列为返回值和消息参数, 传输到代理类的实例里。

(8)客户端应用接受到返回值和消息参数。

1.Web服务的体系结构
Web服务的体系机构是基于服务提供者、服务请求者、服务注册中心3个角色,利用发布、发现、绑定3个操作来构建的。
Web服务涉及:
(1)SOAP(简单对象访问协议)
一种基于XML的、以HTTP作为基础传输协议的消息交换协议
定义了客户端与Web服务交换数据的格式,以及如何通过HTTP交换数据

*包含了4个主要部分:
①SOAP消息
②数据编码规则和统一木星
③RPC消息交换模式
④SOAP与HTTP之间的绑定

(2)Web服务描述语言(WSDL)
用于描述Web服务提供的方法以及调用这些方法的各种方式
WSDL可描述Web服务的3个基本属性:
①服务完成什么功能,指出Web服务提供了哪些方法
②如何访问服务,客户端和Web服务交互的数据格式以及必要的协议
③服务位于何处,与Web服务所用协议相关的地址
 

2.客户端程序与Web服务通信过程

下面的图  通信过程 。

阶段一:序列化
(1)客户端应用程序创建Web服务代理类的一个实例
(2)客户端应用程序调用代理类的方法
(3)客户端基础架构将Web服务所需要的参数序列化为SOAP消息,并通过网络将其发送给Web服务器
阶段二:反序列化
(4)Web服务器接收SOAP消息并反序列化该XML,同时创建实现Web服务的实例,再调用Web服务提供的方法,并将反序列化后的XML作为参数传递给该方法
(5)Web服务器执行Web服务提供的方法,得到返回值和各种输出参数
阶段三:序列化
(6)Web服务器将返回值和输出参数序列化为SOAP消息,并通过网络将其返回给客户端基础架构
阶段四:反序列化
(7)客户端基础架构接收返回的SOAP消息,将XML反序列化为返回值和输出参数,并将其传递给代理类的实例
(8)客户端应用程序接收返回值和输出参数
 

1.3 远程处理RPC

RPC(Remote Procedure Call) —— 远程过程调用。

远程处理技术是为了解决不同计算机上的进程相互访问的一种具体实现。.NET远程处理模型生成一个应用程序,并让其中两个组件直接跨应用程序域边界进行通信。此时需要生成以下内容:
> 一个可远程处理的对象。
>一个宿主应用程序域,用于侦听针对该对象的请求。
> 一个客户端应用程序域,用于发出针对该对象的请求。

神奇的的跳转链接 : 关于RPC的更详细的说明 ,http://www.cnblogs.com/fqfanqi/p/6140877.html

1.4 消息队列(MSMQ)

MQ(Message Queue)是在多个不同的应用程序之间实现相互通信的一种基于队列和事务处理的异步传输模式。

其实现原理是:消息发送者把要发送的信息放入一个容器中(称为Message),然后把它保存至一个系统公用的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。 MSMQ是微软实现的MQ。

2022124113322319.jpg


MSMQ全称是Microsoft Message Queue——微软消息队列。它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。

 1.5 面向服务的体系结构(SOA)

SOA(Service-Oriented Architecture,面向服务的体系结构)。其基本思想就是希望用一种统一的、以"服务"为中心的模型来整合各种不同的技术,而不是仅仅限于Web服务。对于.NET开发人员来说,这个基于SOA的具体实现就是WCF, 而关于整篇所讲的内容, 都是对于我们了解及使用WCF有铺垫性的作用。

实际上SOA只是一种架构设计模式,而SOAP、REST、RPC就是为了实践这种设计模式而设计的数据通讯方式,其中SOAP通俗理解就是服务间通过http+xml的形式完成数据交换,REST就是http+json的形式,RPC是基于socket的形式。CXF框架就是典型的SOAP/REST框架,Dubbo就是典型的RPC框架,而SpringCloud就是遵守REST规范的微服务生态系统。

什么是WCF? 

WCF, 英文全称(windows Communication Foundation) , 即为windows通讯平台。windows想到这里大家都知道了 , WCF也正是由微软公司推出的这个一个玩意, 基于SOA的一个分布式应用程序框架和编程模型(WCF 编程模型的目标实现也就是 :  WCF服务 、 WCF客户端)

描述: WCF的特点

1. 支持多种消息模式 (单向模式、请求/回复、双工)

2. 支持多种传输协议和编码   (Http,tcp ,msmq等。)

3. 支持事务,持久化。

4. 统一,安全,可扩展。

关于WCF的基础知识

> WCF的服务结构

协定: 确定消息格式, 服务类型及安全策略和网络协议。

服务运行时: 处理服务运行中发生的各种行为

消息传递:  描述消息的数据格式和交换模型。

激活和承载: 用于发布WCF服务的寄主。

> 如何创建WCF 服务

打开Visual Studio 新建一个项目, 选择WCF 服务库创建并命名为 HelloWCF。

可以看到, 在创建该项目时, 系统默认为我们添加了一个Iservice1(接口) 和一个  service1 (实现类)。在Iservice1中, 可以看到该接口定义了 ServiceContract 特性, 接口方法中定义了 OperationContract 特性,这两类特性则归属于WCF中的服务协定。

*特性: 

【用来声明服务端定义的所有协定。 在C#中,所有特性类都是从Attribute类继承而来的,而且其名称都有Attribute后缀。用C#编写代码时,一律用中括号来声明特性类,在ServiceContract定义中, 会发现后面跟着Attribute后缀,声明时省略Attribute后缀,这是建议的用法。

特性类的用途是为紧跟在它后面的目标元素提供设计行为。比如对某个字段声明了某个特性,则该特性的目标元素就是这个字段。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植模块、参数、属性(Property)、返回值以及结构等。另外,目标元素还可以是其他特性类。

在CompositeType类中, 可以看到该类定义了 DataContract特性, 与属性中定义了 DataMember 特性 ,而这类则属于WCF中的数据消息协定。Composite  英/ˈkɒmpəzɪt合成的,复合的;

在我们的实际开发过程中, 需要用于数据交互的实体类, 则必须声明类及成员的数据协定, 声明的意义则表示该实体可以序列化。

注: 在WCF定义了DataMember的类成员, 无论是Public、Private, 它都可以被访问。打开service1 类文件, 集成于Iservice1 的接口并且有具体实现, 在我们测试中, 则是利用客户端进行访问进行演示, 而下面,要讲的技术一个关于终结点的概念。

> 终结点(EndPoint)

终结点用于指定网络通信的目标, 在应用程序中,可通过Config文件配置<endpoint>节点进行指定。在终结点中, 含有3个很重要的概念, 俗称ABC, 也就是由地址(Address)、协定(Binding)、绑定(Contract)所组成。

Address : 用于发布服务的位置   公开服务位置,即确定终结点的位置
Binding: 确定的某种通讯方式    公开提供的是哪种具体服务,表示客户端和服务端之间的信息交换规则
Contact: 公开服务的指定类型   定义客户端和服务器端的通信方式

1)地址(Address)
WCF中的地址用于确定终结点的位置,地址可以是URL、FTP、网络路径或本地路径。
WCF规定的地址格式:
[传输协议]😕/[位置][:端口][/服务路径]
WCF服务可以在各种不同的基础网络协议(如TCP、UDP、HTTP等)之间传输
(2)绑定(binding)
WCF通过绑定来定义WCF客户端与WCF服务通信的方式
WCF提供了多种绑定方式(BasicHttpBinding、WSHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetMsmqBinding)
不论是服务端还是客户端,一般都是在单独的配置文件(Web.config、App.config)中配置绑定
(3)协定(Contract)
协定表示客户端和服务端之间的信息交换规则,如果不指定协定,就无法在客户端和服务端之间进行通信
协定在接口中用Contract特性声明,内部用ContractAttribute类来实现,在配置文件中用contract指定
 

在刚才新建的WCF服务库中, 打开配置文件, 可以看到endpoint节点, 该节点则是用于发布WCF服务。

到现在为止, 只是介绍了WCF服务的一个简单组成, 那么既然是服务,肯定是要给别人用, 所以下一步就是, 需要一个寄主, 

举个例子 : 就像地铁卡充值服务,  一般这个服务是独立的, 我们要去便利店也好, 药店或者地铁里面充值, 他们都提供地铁卡充值服务, 而这些充值地铁卡的地方, 可以简称为宿主(服务的承载)。所以, 我们下一步就是为这个WCF服务创建一个寄主, 简单的例子, 我们以控制台的形式进行创建。

注: 实际上,WCF支持多种寄宿模式, windows应用程序, 控制台应用程序,IIS等。

> 选择右键, 新建一个控制台应用程序, 并命名为  WCFService

然后添加对HelloWCF的项目引用, 以及System.ServiceModel程序集的引用。

注: 该编程模型封装在.NET框架的System.ServiceModel命名空间中。

 将HelloWCF中的APP.config的 system.serviceModel节点复制到控制台的配置文件中。

打开Program文件, 编写以下代码, 用于启动WCF服务。

服务端的构建以及完成, 运行控制台项目, 打开此服务, 不要关闭, 下一步则是建立客户端应用程序,并且访问该WCF服务。

> 创建WCF客户端

1.打开Visual Studio , 新建一个windows窗体应用程序, 命名为: WcfClient

 2. 选择项目引用, 右键添加服务引用, 此时回到我们的服务应用程序中, 找到服务的基地址, 在配置文件中复制该地址。

3.添加该地址的服用引用, 命名使用默认(实际开发过程中可根据服务的类型进行定义), 点击确定, 此时我们在Form1中

添加一个按钮, 用于测试访问服务, 

4.双击进入, 创建该服务的实例, 调用接口实现的方法, 弹窗的形式显示结果。

 5.测试结果, 成功的调用了WCF服务中的GetData()方法。 

服务协定

服务协定:指WCF对客户端公开哪些服务
WCF服务端通过服务协定向客户端公开以下内容:
①操作方法
②消息交换模式
③采用的通信协议以及序列化格式
服务协定包括ServiceContract特性和OperationContract特性:
ServiceContract协定用于在应用程序中定义服务协定
OperationContract协定用于在应用程序中定义操作协定

ServiceContract特性常用属性

 OperationContract特性常用属性OperationContract特性常用属性

 基本用法:
//在接口的前面用ServiceContract特性声明服务协定,在接口的内部用操作协定公开操作方法;在对应类中实现接口声明的方法:

[ServiceContract(NameSpace="WcfServiceExamples")]
public interface IService1{
	[OperationContract] double Add(double n1,double n2);
	[OperationContract] double Divide(double n1,double n2);
}

//WCF规定实现服务的接口中只能包含方法声明,不允许在接口中声明属性和字段,属性和字段是在实现接口中的类中通过数据协定来公开的

public class Service1:IService1{
	public double Add(double d1,double d2){
		return d1+d2;
	}
	public double Divide(double d1,double d2){
		return d1/d2;
	}
}

数据协定
数据协定:数据协定是服务端与客户端之间交换数据的约定,即用某种抽象方式描述要交换的数据并将其传输到客户端
数据协定默认采用XML格式
数据协定利用DataContract特性和DataMember特性声明:
①DataContract特性定义哪些类可以被序列化
②DataMember特性用于声明类中的哪些成员可被序列化
基本用法:
①显式声明数据协定和成员协定:对于显式声明DataContract特性和DataMember特性的成员进行序列化
[DataContract]
public class MyData1{
//不论是private还是public,只要声明DataMember就可以序列化
public string MyName1=“me1”;//未声明DataMember,无法序列化
[DataMember]public string MyName2=“me2”;
[DataMember]public string myName3=“me3”;
[DataMember]public int Age{get;set;};
[DataMember]public List MyStudents{get;set;};
private string telephone=“null”;//无法序列化
[DataMember]
public string Telephone{
get{return telephone;}
set{telephone = value;}
}
}
②隐式声明数据协定和成员协定:WCF会自动对具有public修饰符的类、结构、枚举等应用数据协定,对具有public修饰符的字段和同时具有get和set的属性应用成员协定。
 

在这里插入图片描述 消息协定

消息协定:在有些情况下,需要用单个类型来表示整个消息,使用消息协定可以避免在XML序列化时产生不必要的包装

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值