当前位置: 首页 > 编程日记 > 正文

WCF 第二章 契约

在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中,契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同。

契约是由服务终结点发送或接收的消息的描述。每一个终结点都由ABCs定义:一个消息发送到的网络上的地址,一个描述消息如何发送的绑定,一个描述消息格式的契约。

记住服务实际上是终结点集合,终结点用代码实现了特殊算法。它们可以实现高级别的商业功能,比如进入一个订单履行系统,或者可以更细粒度,比如寻找客户的 地址。高级功能一般需要复杂的数据结构,而针对性的功能通常需要更多基本数据类型。在任何一种情况下,终结点必须确认它要完成的操作和它期望的数据格式。 它们一起构成了契约。

WCF中三种类型的契约:

  服务契约。服务契约描述了服务的功能性操作的实现。服务契约将.NET类型中的类方法映射成WSDL服务,端口类型和操作。在服务契约中的操作契约描述服务操作,服务契约是用来描述服务功能的方法。

数据契约。数据契约描述了被服务端用来与客户端通信的数据结构。数据契约将CLR类型映射成XML元数据定义(XSD)而且定义了它们如何序列化和反序列化。数据契约描述了由服务操作发送和接收的所有数据。

  消息契约。消息契约将CLR类型映射成SOAP消息而且描述了SOAP消息格式并影响消息中WSDL和XSD的定义。消息契约提供了对SOAP消息头和消息体的精确控制。

为了使契约可以再最广泛的系统之间共用,它们被使用网络服务描述语言(WSDL)表达。所以,在继续进行更加深入的契约讨论之前,对WSDL进行一个间断的介绍是有帮助的。根据W3C的标准,行业供应商(Microsoft, IBM, 等等)定义了WSDL规范。

WSDL是一种用于描述作为一个端点对包含任何面向文档或程序为导向的信息服务,网络服务设 置的XML格式。操作和消息被抽象的描述,然后绑定到一个具体的网络协议和消息格式来定义一个终结点。相关具体的终结点与抽象终结点(服务)连接到一起。 WSDL可以扩展描述终结点和消息而不必考虑通信中的消息格式或者网络协议;然而,文档中唯一描述的绑定是关于如何使用WSDL与SOAP 1.1,HTTP GET/POST和MIME进行连接。

详细说明在www.w3.org/TR/wsdl, 描述了关键概念和支持细节以便于厂商如微软可以生成工具来生成和使用WSDL。主要的WSDL组成在表2.1中介绍,从公开规则中介绍和扩展。

表2.1 WSDL组成 
 
   因为契约以WSDL和XSD描述的但是代码一般都是使用CLR类型,这需要在两种系统之间有一个映射。WCF用三个过程来使映射更加便利。首先,当写服务 端代码时,你使用WCF定义属性[SeviceContract],[OperationContract],[FaultContract], [MessageContract]和[DataContract].当写客户端代码时,你会查询服务来了解契约细节并生成一个代理类来暴露一个可以从代 码中调用的服务接口。这是使用Visual Studio 或者svcutil.exe,调用服务中的元数据结构终结点来从属性定义的代码产生WSDL.最后,当一个客户端在运行时调用服务接口中的方法,WCF把 CLR类型和方法调用序列化成XML然后根据WSDL中约定的绑定和编码计划来在线上传输消息。
 
   这里总共有四个结构;两个在.NET两个在XML。在.NET中,一个CLR类型定义数据结构或者作用,但是除非那个类型的对象被初始化否则不能做任何事。在XML中,一个XSD定义数据结构,但是除非一个XML实例被创建否则没有任何实际消息存在。
 
   所以为了恰当的了解WCF是怎样工作的,你需要了解代码和WCF。幸运的是,WCF提供了必要的工作来映射它们。第一个工具,SvcUtil.exe,可 以从命令行被显示的调用或者隐式的通过Visual Studio添加服务引用调用。这个工具,有很多功能,产生WSDL并生成代理类来实现.NET类型和XSD之间的映射,还有.NET类方法和WSDL操 作。第二个工具,服务跟踪查看器,或者SvcTraceViewer.exe,是一个图形化工具,可以读取并理解WCF生成的诊断日志文件。使用这个工 具,我们可以查看终结点接收到的和发送出的消息格式,并可以跟踪消息流。这个工具在第九章详细介绍,“诊断”。
 
   在这一章我们将介绍如何使用五分之四的契约类型。我们将从查看暴露终结点和定义方法的操作契约的服务契约开始。然后我们将检查描述终结点数据传入传出的数 据契约。最后,我们将描述提供对SOAP消息更多控制的消息契约。在这本书的接下来章节我们将讨论错误契约,在第十章,“错误处理”。


===========

转载自

作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/llbofchina/archive/2011/06/27/2091330.html

相关文章:

织梦 新建 php arclist,织梦arclist按照自定义字段来调用相关文章

织梦arclist按照自定义字段来调用相关文章,这对于想要在首页调用某个自定义字段的文章的同学来讲,非常不错,接下来看教程打开 include aglibrclist.lib.php 找到://时间限制(用于调用最近热门文章、热门评论之类),这里…

提高php编程效率的小结

1.如果将类的方法定义为:static,它的执行效率将提升为近4倍 2.php中数组的元素调用,使用关联数组优于索引数组 3.使用each快于print. 4.尽量使用foreach()替代for(). 5.销毁那些不用的变量尤其是大数组,如:unset().以便释放内存 6…

摄像机的几个重要的技术指标

(1)清晰度 清晰度是一个摄像机的最重要指标,在监控系统中对图像的清晰度有很高的要求,如在交通监控中,对车辆要能看清车牌号码,对行人要能看清脸部特征,如果这些都看不清楚,那么监控将失去意义。线数的多少决定着清晰度…

Docker容器入门-基本命令的使用

目前容器技术使用相当广泛 不会或者没有使用过容器感觉都不像是个搞技术的 所以,我也就docker相关内容做一个整理 只有不断的学习,才能保持自己的竞争力 什么是容器? 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可…

卸载linux系统装win,如何在计算机上删除 Linux 并安装 Windows

多个 IDE 驱动器Device Boot Start End Blocks Id System/dev/hda1 * 1 500 4016218 83 Linux native (IDE hard drive 1, partition 1)/dev/hda2 501 522 176715 82 Linux swap (IDE hard drive 1, partition 2)/dev/hdb1 1 500 4016218 83 Linux native (IDE hard drive 2, p…

卡尔曼滤波— Constant Velocity Model

假设你开车进入隧道,GPS信号丢失,现在我们要确定汽车在隧道内的位置。汽车的绝对速度可以通过车轮转速计算得到,汽车朝向可以通过yaw rate sensor(A yaw-rate sensor is a gyroscopic device that measures a vehicle’s angular velocity ar…

优化实战:不要随便将字段折腾来折腾去的

到新公司先看了看数据库的性能,查看一个存储占用的CPU巨多,而且执行次数也特别多,打开一看:alterPROCEDURE[dbo].[IPLogInsert]IPchar(15) 255.255.255.255ASBEGINSETNOCOUNT ON; declarecurrIdintdeclaretodaydatetime--SET cur…

SQL SERVER 架构管理

架构特点: 架构是数据库级的安全对象,是数据库中表、视图、存储过程等对象的容器,是形成单个命名空间的数据库实体的集合,一个架构只能有一个拥有者。 将所有权与架构分离的意义: ①架构所有权和架构范围内的安全对象可…

linux 端口 流量统计,Linux下如何对端口流量进行统计

在不修改源代码的情况下对程序暴露端口流量进行监控统计,可以利用Linux中自带的Iptable添加简单的规则让其起到端口流量统计的作用。但是需要注意的是在服务器重启、Iptable服务重启的时候统计数据会被重置清零。添加需要统计的端口1、输入监控下面示例是监控目标端…

如何轻松实现iOS9多任务管理器效果(iCarousel高级教程)

前言 iOS9系统下 为了我司APP的兼容性问题 特意把手上的iOS Mac XCode都升级到了最新的beta版 然后发现iOS9的多任务管理器风格大变 变成了下面这种样子 我忽然想起来之前的文章提到我最爱的UI控件iCarousel要实现类似这种效果其实是很简单的 一时兴起就花时间试验了一下 效果还…

linux并发控制之自旋锁

自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式。通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为“我当前在运行,请等待”或者标记为“我当前不在运行,可以被使用”, 如果A…

半透明遮罩层覆盖整个可视区域

我们经常会遇到点击一个按钮弹出一个对话框和一个变暗的遮罩层,简单的写法只能让遮罩层覆盖浏览器的大小,那么怎么让遮罩层覆盖全部区域呢? css代码如下: 1 html,body {2 height: 100%;3 margin: 0;4 padding: 0;5 }6…

观察内核linux行为,Linux 学习:基于proc观察Linux行为

内容简介本篇博文的主要内容是通过/proc文件,对Linux系统管理有一个初步的认识。在Linux中,proc文件系统提供了一套在用户态检查内核状态和系统特征的机制。proc文件系统将进程的地址空间、系统的硬件信息、系统相关机制(中断、I/O)等内容全部设置为虚拟…

对数据库表中的某一字段去重分组排序

1、问题背景 某数据库t_tab_ab中有两个字段a和b,例如以下所看到的: 查询前: 查询后: a b a b 1 2 1 2 1 3 2 3 1 4 …

设置应用图标badge(徽章)

// 图标右上角的数字[UIApplication sharedApplication].applicationIconBadgeNumber msgCount result.status result.follower; 转载于:https://www.cnblogs.com/pretty-guy/articles/4106529.html

hdu - 1087 - Super Jumping! Jumping! Jumping!

题意&#xff1a;求最大升序和。 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1087 ——>>设d[i]表示以第i个数为终点的最大升序和&#xff0c;然后从第1个数到第i-1个数为终点的最大升序和进行检查&#xff0c;向后递推即可。 #include <iostrea…

linux 读取大量图片 内存,10 张图帮你搞定 TensorFlow 数据读取机制

导读在学习tensorflow的过程中&#xff0c;有很多小伙伴反映读取数据这一块很难理解。确实这一块官方的教程比较简略&#xff0c;网上也找不到什么合适的学习材料。今天这篇文章就以图片的形式&#xff0c;用最简单的语言&#xff0c;为大家详细解释一下tensorflow的数据读取机…

安卓真机测试安装时报错

在将程序发布到手机上时提示该错误&#xff1a; INSTALL_FAILED_INSUFFICIENT_STORAGE 手机内存满了...删除程序... 就可以安装了转载于:https://www.cnblogs.com/H-K-Home/p/5279819.html

C#学习笔记——捕获当前屏幕

编程思路&#xff08;API 编程&#xff09;&#xff1a; 先调用 GetForegroundWindow 获取当前活动程序窗口句柄&#xff0c;然后调用 GetWindowDC 获取窗口的设备句柄&#xff08;或 GetDC 函数&#xff09;&#xff0c;调用 BitBlt 位图传输函数将位图拷贝到兼容的设备场景中…

Exception loading sessions from persistent storage

严重: Exception loading sessions from persistent storage java.io.EOFException 删除Tomcat里面的work/Catalina/localhost下的内容即可解决 Tomcat在启动时出现如下异常问题&#xff1a; 严重: IOException while loading persisted sessions: java.io.EOFException严重: E…

linux独立应用程序开发,Linux应用程序开发(一)

Linux应用程序开发(一)---移植thttpdSqlite3PHP5到arm linux(4)移植环境(红色粗字体字为修改后内容&#xff0c;蓝色粗体字为特别注意内容)1&#xff0c;主机环境&#xff1a;VMare下CentOS 5.5 &#xff0c;1G内存。2&#xff0c;集成开发环境&#xff1a;Elipse IDE3&#xf…

面向过程(结构化)分析方法与面向对象分析方法的区别

面向过程是从问题的总体目标开始&#xff0c;抽象底层的细节&#xff0c;先专心构造高层的结构&#xff0c;然后再一层一层地分解合细化。 面向对象则是运用对象、类、继承、封装、聚合、消息传递、多态性等概念来构造系统的方法。 面向过程着重于解决问题的从粗略到详尽的方法…

eclipse.ini内存设置

-vmargs -Xms128M -Xmx512M -XX:PermSize64M -XX:MaxPermSize128M 这里有几个问题&#xff1a;1. 各个参数的含义什么&#xff1f;2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动&#xff0c;而有些机器无法启动&#xff1f;3. 为何将上面的参数写…

如何运用下载来的模板

&#xff08;1&#xff09;在相应的网址下载模块文件 例如&#xff1a;https://github.com/yagitoshiro/ImageAsResized &#xff08;2&#xff09;把下载的模块包解压放到C:\Users\Administrator\AppData\Roaming\Titanium\modules\android 目录结构如下所示&#xff1a; 而这…

红旗linux桌面版反应慢,红旗Linux6.0桌面版使用感受

1.红旗Linux6.0桌面版中文支持比较好&#xff0c;毕竟是国人出的发行版&#xff1b;输入法很不错&#xff1b;自动挂载win分区(好像Ubuntu、OpenSUSE、Fedora等这些流行发行版的新版都支持了)&#xff0c;自动安装网络&#xff0c;用路由的话可以直接上网了。2.处处向windows靠…

device.cpp

Java代码 #include "device.h" #include <math.h> //Class Timer member function implementation int Timer::createTimer() { _start 0; _clocks 0; #ifdef _WIN32 QueryPerformanceFrequency((LARGE_INTEGER* )&_freq); #else _freq (long long)1.0E…

简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...

函数式编程 Lambda exec&#xff0c;eval和assert语句&#xff0c;repr函数 lambda语句 用来创建简短的单行匿名函数 print_assign lambda name, value: name str(value)等同于def print_assign(name, value): return name str(value) lambda需要一个参数&#xf…

防止重复提交订单-(转)

防止重复提交 Button1.Attributes.Add("onclick", "this.value正在提交中&#xff0c;请等待……;this.disabledtrue;" this.GetPostBackEventReference(Button1)); 于是根据这个写了个只能提交一次的控件&#xff1a; publicclassButtonSubmitOn…

linux pps 包 网卡,linux下安装PPS

到官方下载FEDORA版RPM包。[talenliangshan Downloads]$ sudo yum localinstall PPStream.rpm已加载插件&#xff1a;axelget, fastestmirror, presto, priorities, refresh-packagekit, remove-with-leaves设置本地安装进程诊断 PPStream.rpm: PPStream-1.0.2-11.i386PPStream…

C#设置本地网络(DNS、网关、子网掩码、IP)

如今网络在我们的生活工作中所起的作用越来越大&#xff0c;可以说离开了网络我们就无法正常的工作和生活。作为程序员我们写的程序大多数也会跟网络相关&#xff0c;而想要使用网络首先要将机器的网络配置设置好。而手动设置的方法显然很不可取&#xff0c;所以我们要让程序帮…