导航:首页 > 编程语言 > wcf服务编程pdf下载

wcf服务编程pdf下载

发布时间:2023-05-30 08:28:09

① 跪求WCF的工作原理

首先:

WCF的全称是,Windows通信基础的意思,是Microsoft为构建面向服务的应用程序而提供的统一编程模型,它整合.NET平台下所有和分布式系统有关的技术。

其次:

WCF本质是面向服务的。主要分为服务端和客户端两部分。服务端和客户端进行通信的过程如下图所示:

在上图中,主机进程就是服务端,在其中需要创建服务,然后将服务通过EndPoint(终结点)与客户端进行通信。客户端在使用服务时,需要首先创建一个代理服务,然后调用这个代理服务。

EndPoint(终结点)在WCF中是非常重要的部分。它包含了服务地址(Address)、绑定格式(Binding)和契约(Contract)。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约定义了服务所提供的功能。为了便于记忆,我们将终结点的这三个要素简称为服务的ABC

服务端提供了什么服务,都具备什么功能,燃帆这被称为WCF服务的契约。

WCF服务不能凭空存在。备段神每个WCF服务都必须托管(Hosting)在一个Windows进程中,该进程被称为宿主进程。

WCF服务宿主可以由IIS提供,可以由Windows服仿亏务提供,也可以由WindowsVista的Windows激活服务提供。其中,使用IIS托管只能使用HTTP协议。

② WCF服务编程一书中写到:契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约

在过程调用中传递了一个无效参数。这可能是由于参数超出范围,或包含无效数据。另外,有可能在不适当的时间对过程进行了调用。要纠正该错误验证传递给过程的参数是有效的。验证在适当的时间调用函数。溢出试图赋给变量的赋值太大,这是因为:赋值,计算或者数据类型转换结果很大以至于不能代表此种类型变量值的范围。属性赋值超出了属性所能接受的最大值。整数类型数字的计算结果大于一个整数。要纠正该错误将值赋给一个较大取值范围的变量类型。确保赋值符合属性范围。内存不足分配与该计算机有效内存一样多的内存。这可能是一个动态分配数组增长得太大,或者是对象实例数目过多。要纠正该错误使用Erase语句来重新分配动态数组的储存空间。使用ReDim语句来重新分配储存空间。关闭任何已经打开、不必需的应用程序,文件或者源文件。下标越界要访问的数组中元素数目比期望的少。例如试图从一个定义为10个元素的数组中访问到11个元素。.要纠正该错误确保你的代码中包含检察元素是否越界的边界。重新定义一个更大的数组大小至需要的维数。该数组为定长的或者临时被锁定试图用ReDim函数来改变一个定长数组的元素数目。动态数组或者Variant变量内的数组可以被暂时的锁定。要纠正该错误如果在过程内部定义数组,用ReDim函数将其从静态变为动态。如果在模块水平上说明数组,不要指定数组中元素的数目。被零除创建一个试图将数字被零除的表达式。被零除得到无穷大(不可用)结果。要纠正该错误检查表达式的输入或大小写错误。类型不匹配试图比较不相容数据类型的值。例如,比较一个字符串和一个数值。要纠正该错误当进行比较时,要确保数据类型相同。用一个的数据类型来计算另一个的值,然后重新比较。字符串空间溢出试图创建字符串对象时系统内存被用尽。这可能是因为动态分配数组越来越大或对象实例的数目过大。要纠正该错误使用Erase语句来重新分配动态数组的储存空间。使用ReDim语句来重新分配储存空间。关闭任何已经打开、不必需的应用程序,文件或者源文件无法执行请求的操作当主机使脚本引擎中断时无法继续执行脚本。主机未指定明确的返回错误代码。要纠正该错误该错误的解决与主机有关。堆栈溢出过程嵌套太深。每次代码从一个过程跳到另一个过程,本地变量的内容被放到堆栈中。堆栈是一个大小随着要求执行的脚本动态增长和缩小的内存工作区域。要纠正该错误检查没有嵌套很深的过程。确保递归(重入)过程没有经常的调用自身。确保递归过程被正常终止。未定义Sub或Function试图调用一个不存在的过程。要纠正该错误检查过程的拼写确保输入正确。加载DLL错误应用程序引用了一个无法找到的DLL,一个DLL可能引用了另一个无法找到的DLL。要纠正该错误确保DLL存在。使用全路径名引用DLL。获得被引用的DLL并使其对其他DLL有效。内部错误发生内部错误。要纠正该错误除非这是由Raise方法产生,请与微软产品服务联系报告出现错误消息的情况。未设置对象变量试图使用无效对象的对象属性。如果遗漏了Set语句,将在对象引用产生错误。要纠正该错误为对象变量指定一个引用。For循环未初始化在脚本中执行跳到ForNext循环中间的结果。由于ForNext循环计数必须被初始化所以产生错误。下面演示了一个ForNext循环的正确结构。Forcounter=startToend[Stepstep][statements][ExitFor][statements]Next要纠正该错误移去跳转至ForNext循环的语句。确保ForNext循环包含了所有必须的部分。非法使用Null试图获得一个为Null的Variant变量的值。你只能获得包含有效值的Variant变量的值。Null是一个Variant一个用来指示一个数据项不包含任何有效数据的子类型。要纠正该错误确保变量包含有效数据。需要对象提供的对象无效(或无法认为是一个对象)。对属性和方法的引用需要一个显式的对象限定符。要纠正该错误提供一个对象限定符。检查对象限定符的拼写。ActiveX部件无法创建对象由于对象类未在系统注册表中注册或者是一个或多个相关的动态链接库无效(DLLs),VB5.5运行时无法初始化对象。另外一种可能情况是,由于未找到或是已经损坏,对象所需的DLL不可用。要纠正该错误确保所有相关的DLLs有效。例如,数据存取对象(DAO)所需的DLLs在不同的平台下是不同的。你可能不得不返回到安装程序查找该对象。InternetExplorer可能试图创建对象,但是在InternetExplorer中没有正确的安全许可。重置InternetExplorer安全设置并重试。类不支持自动化试图操作一个并不支持自动化的对象属性或方法。可以创建并将指针传递给不支持自动化的对象,但是不能获取它的属性和方法。要纠正该错误查创建对象应用程序的文档中关于该类自动化使用的限制。注意对象可能已经通过使用CreateObject被创建,但可能已经通过主机对象模型被引入。在自动化操作中未找到文件名或类名使用GetObject函数,但是将一个不可识别的类或文件名作为参数。GetObject函数要求包含要获取的对象的文件的完整的路径和名称,或者是在系统中注册过的类名称。要纠正该错误检查名称的拼写错误,然后重试。确保class参数的名称与在系统中注册的相匹配。对象不支持该属性或方法对该自动化对象指定了一个并不存在的属性或方法。不是所有的对象都支持所有的属性和方法。要纠正该错误检查属性和方法以确保没有打字错误。参见对象的文档获取的信息。对象不支持此操作试图引用该对象不支持的一个方法或属性。不是所有的对象支持所用的操作。要纠正该错误检查属性和方法以确保没有打字错误。参见对象的文档获取的信息。对象不支持当前的区域设置试图操作一个不支持当前区域设置的对象。区域设置是和给定语言以及国家/地区相对应的一系列信息。本地影响预定义程序项的语言和本地特定设置。以下两种情况时本地信息很重要:codelocale影响语言项例如关键词,并且定义本地特定设置例如小数和列表分割符,日期格式和字符排列顺序。systemlocale影响本地相关的功能执行。例如,当显示数字或者将字符串转换为日期时。使用操作系统提供的控制面板工具来设定系统。要纠正该错误检查对象支持的区域设置。未找到命名参数调用一个过程并指定一个特别的参数,但是过程未被定义为接受以为名称的参数。除非在过程定义中出现,一个命名参数不能在过程调用中使用。要纠正该错误检查参数名称是否正确拼写,然后再试着调用过程。参数不可选调用过程但是参数数量错误。传递给过程的参数的数量必须与过程定义的参数数量相同。要纠正该错误检查函数符号确保提供了所有必须的参数。错误的参数个数或无效的参数属性值调用过程时如果:错误的过程名称,或者,过程中参数数目错误,或者,参数类型错误。传递给过程的参数数目必须与过程定义中的参数数目相符。要纠正该错误检查以确保传递给过程的参数列表与过程定义或声明中的相符。对象不是一个集合试图对一个不是Collection类型的对象进行只对Collection对象有效的操作。有些属性、方法和操作仅可应用于Collection对象。Collection对象是包含一组互相关联的对象的一种对象。一旦集合中发生了改变,一个对象在Collection对象中的位置也会发生改变;因此,Collection对象中的任何一个对象的位置都可能变化。要纠正该错误检查对象或属性名称的拼写。验证对象是一个Collection对象。查看用来向集合中添加该对象的Add方法,确保语法正确且任何标识符的拼写都正确。变量使用了VB不支持的自动化类型试图使用类型库或者对象库中不被支持的数据类型,任何一门编程语言都不能使用类型库或对象库中的所有变量。要纠正该错误只使用VB识别的变量类型。远程服务器不存在或者不能访问用CreateObject函数来建立一个远程机器的对象,但是调用失败,这是因为无法访问远程服务器或者没有包含特定的类。要纠正该错误检验远程服务器的名字是否正确。检验远程服务器的DCOM可用。使用dcomcnfg验证安全权限是否允许建立对象。无效图片试图加载一个无法识别格式的图像。有效格式包括位图(*.bmp),图标(*.ico),以及Windows元文件(*.wmf)。要纠正该错误确保要加载的图像文件的格式是有效的。变量未定义在脚本开始处用OptionExplicit语句,后来又使用一个未被说明的变量名称。当使用OptionExplicit语句时,必须用Dim,Private,Public或者ReDim语句显式地说明所有的变量。要纠正该错误使用OptionExplicit语句时,确保用Dim,Private,Public,OrReDim语句定义了所有的变量。脚本对象不安全试图使用未被标识为脚本安全的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。对象不能安全初始化试图使用未被标识为初始化安全的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。对象不能安全创建试图使用一个未被标识为安全创建的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。无效或不合格的引用试图对不止一个对象使用With语句。With语句只能被非空对象使用。下面演示了一个With块的正确结构。WithobjectstatementsEndWith要纠正该错误为With语句指定一个对象。类未定义引用未定义(通过New或Set语句)的类。要纠正该错误确保在引用类之前已经定义。发生异常脚本调用COM对象,然后产生异常。要纠正该错误除非该调用由Raise方法产生,请与产生错误的CM对象开发人员联系。请与微软产品服务联系报告出现错误消息的情况。正则表达式中的语法错误搜索字符串的结构违背了VB正则表达式中的一个或多个语法规则。要纠正该错误保证常规的搜索字符串的表达式符合Perlde的表达语法。错误的数量词当构造正则表达式的搜索模式时,没有正确的说明匹配的字符串。要纠正该错误确保搜索模式是正确构造的。在正则表达式中需要']'试图为正则表达式匹配创建一个字符类,但未包含右括号。将单独的字符组合放到方括号里可以将其装配到字符类中。例如,/[abc]/匹配字母“a”,“b”,或“c”中任意一个。要纠正该错误在正则表达式中添加右括号。在正则表达式中需要')'试图创建常规的嵌套表达式,但未包含“)”。在正则表达式中括号有几个目的。首先,它将分离的项组成为单个子表达式,所以项目可以通过*,+,?等等来当作一个单元来处理。要纠正该错误在常规的嵌套表达式中添加右(闭)括号“)”。字符集越界试图使用无效字符创建正则表达式。正则表达式是由字母数字和元字符组成的。要纠正该错误仅仅使用有效正则表达式字符来组成正则表达式。求采纳为满意回答。

③ WCF是什么如何学习

Windows Communication Foundation (WCF)是一个面向服务编程的综合分层架构。该架构的顶层称为服务模型层(Service Model Layer),使用户用最少的时间和经历建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。 开发WCF服务的端点需要涉及下面几个任务:坦型纯开发服务契约:指定端点可用的WCF服务的操作。开发绑定:绑定指点端点让咐与外界通信的协议。添加,删除,更新和配置端点:在配置文件中添加和绑定端点(当然也可以用编码的形式,但是不推荐。)租岁添加行为:一个行为就是一个组件,能增强服务,端点,和操作的运行时行为。

④ ASP.NET 3.5核心编程之AJAX Web Service的调用


AJAX模型基于两个层次--客户端应用程序层和服务器应用程序层。在这种模型下,客户端层向服务器层发送请求,而服务器层向客户端层返回响应。服务器端点通过URL标识,并通过源(feed)(通常为JSON[javaScript Object Notation]数据流)向客户端暴露数据。服务器层只是一个接收调用并将其转发给应用程序业务逻辑层的外观。
下图描绘了整个模型:
为使 AJAX页面能够调用远程服务,该服务必须满足几点要求,其中最关键中行的一点与端点和底层平台的位置有关。支持AJAX的服务必须位于调用者所处的域中。这意味着该服务必须是 XML Web服务(。asmx端吵孝点),必须以应用程序的形式寄放于同一Web服务器的某个IIS应用程序中。
总的来说,对于 AJAX应用服务,有3种定义服务器层服务的方式:
1. 带有asmx端点的 XML Web服务。
2. 带有svc端点的WCF服务。
3. 带有aspx端点的页面方法,这些方法定义在与主调页面相同的页面中。
"服务(Service)"这个词往往被误用。在AJAX中,服务指的是隶属于应用程序的代码(位于应用程序的域中),用于向客户端暴露相应的功能。从根本上讲,AJAX应用程序使用的服务一般不通过简单对象访问协议(SOAP)进行通信(而是使用JSON),不必是面向服务架构(SOA)中自治的服务。它们与自身所处平台和域绑定。因此,不能称这里的服务为WS-*Web服务和SOA服务。
REST服务
针对AJAX应用程序的服务围绕着暴露给Web客户端数据和资源。二者可通过HTTP获取,要求客户端通过URL(也可以有HTTP标头)来访问数据和命令操作。客户端与服务的交互是通过GET、POST、PUT和DELETE这样的动作来完成。换言之,URL用于描述所要获取的资源,HTTP动作用于描述对资源执行的操作。这类交互过程中交换的数据由简单的格式表示,甚至可以用联合格式(如RSS和ATOM)表示。
具有这些特性的服务为具象状态传输(Representational State Transfer,REST)。
数据的序列化
AJAX调用包含作为参数传给被调服务方法的数据及作为输出返回的数据。这些数据是如何序列化的?
通信双方都能理解的序列化格式为JavaScript对象表示法(JSON)。JSON是一种基于文本的格式,专门用于在不同层次间传递对象的状态。JavaScript支持JSON,可通过JavaScript的eval函数将JSON兼容的字符串转换为JavaScript对象。然而,如果JavaScript字符串代表自定义对象的状态,那么开发者应确保具有相应类的定义。
AJAX网络堆栈要负责为每个远程传递的对象创建JSON字符串。在服务器端,通过专门的格式化程序类接收数据,并通过。NET反射来填充与之匹配的托管类。在返回时,.NET托管类会被序列化为JSON字符串,并发送给客户端。脚本管理器会确保引用这些JSON字符串的类(Web服务代理类)存在于客户端。
下面给出一个描述对象状态的JSON格式的示例:
{"ID":"ALFKI", "Company":"Alfred Futterkiste"}
这个字符串说明该对象有两个属性:ID和Company,存储的是以字符串的形式序列化的值。如果某个属性被赋予一个非基本类型的值(如自定义对象),那么该值会以递归方式序列化为JSON.[
JSON与XML
相比XML,JSON更精炼,升培稿更适合JavaScript语言。
应用程序特定的Web服务
在默认情况下, Web服务收发的是SOAP数据包(而不是JSON数据包),通过Web服务描述语言(Web Services Description Language,WSDL)文档来暴露其协定。AJAX应用程序上下文中的 XML Web服务是如何工作的呢?
可以通过 AJAX应用程序的web.config文件来修改接收asmx请求的HTTP处理程序,将这些调用重定向给能够理解JSON流的HTTP处理程序。这意味着 XML Web服务可以是一种双重的服务,即可接受和处理SOAP请求,也可针对JSON请求。在配置层,我们可以禁用SOAP支持,并隐藏用于对外公开该服务功能的WSDL文件。
如果要使用支持JSON的 Web服务,则需要删除XML,因为在调用 Web服务时,我们不处理SOAP和XML.针对AJAX应用程序的 Web服务不采用SOAP消息。
远程编程接口的定义
协定(contract)用于定义服务器端端点暴露给调用者的内容。如果希望以 Web服务的形式实现,则不严格要求存在实际的协定。但如果 3.5中的WCF服务,那么协定就必须存在。总而言之,以接口形式设计的公共API会使代码更整洁。在实现该接口的类创建完毕后,有关服务器API接口的工作就结束了。这样我们就可以发布这个远程API,并使 AJAX运行库来管理来自客户端的调用。
对于 Web服务,我们通过纯粹的接口来定义协定,使该接口包含与服务器API有关的方法和属性。下面给出一个简单的服务:
using System;public interface ITimeService{
DateTime GetTime();
string GetTimeFormat(string format);}
这两个方法构成了可以在客户端调用的服务器API.
实现已约定的接口
Web服务通常通过派生自基类WebService的。NET类来实现:
using System.Web.Services;public class TimeService : WebService, ITimeService{
}
注意,没有必要一定要从基类WebService派生,这个基类主要用于直接访问一些常用的对象(如Application和Session)。如果不需要直接访问这些内部的对象,即使不从WebService类派生也能创建 Web服务。这种情况下,我们可通过HttpContext对象来间接地使用内部的对象。
协定的发布
从本质来说,发布给定的服务器协定,就是生成一个嵌在页面中的脚本能够调用的JavaScript代理类。如果服务器API通过Web服务实现,我们要向 AJAX页面的脚本管理器注册该Web服务。此外,我们还要在web.config文件中添加一个特殊的asmx请求HTTP处理程序。
Web服务的远程调用
Web服务提供了服务器端代码的宿主环境,以便在响应客户端的操作时进行调用。服务中的Web方法指向应用程序特定的代码。
AJAX Web服务的创建
为 AJAX应用程序定制的Web服务比其他 Web服务要小。 AJAX Web服务与传统的 XML Web服务间存在两方面的差异。
首先,若使用 AJAX Web服务,那么为满足特定应用程序的需要,我们要设计 AJAX Web服务的协定,而不是配置公共服务的行为。目标应用程序就是Web服务的宿主。其次,我们必须使用一个新的特性(attribute)来声明这种Web服务的类,而在常规的 XML Web服务中这是不允许的。
最终的效果是, AJAX Web服务可能有两套公共接口:一套是基于JSON对接口,由宿主 AJAX应用程序使用;另一套是基于SOAP的接口,暴露给客户端,任何平台都能访问该服务的URL.
ScriptService特性(attribute)
为创建 AJAX Web服务,第一步是要建立标准的 Web服务项目,随后导入System.Web.Script.Services命名空间:
using System.Web.Script.Services;namespace Core35.WebService{
[WebService(Namespace="
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class TimeService : System.Web.Services.WebService, ITimeService
{

}}
ScriptService特性是使 XML Web服务与 AJAX Web服务间产生差异的关键。该特性指出,该服务旨在接受来自基于JavaScript客户端代理的调用。
阻塞SOAP客户端
一旦创建AJAX Web服务,便可以ASMX资源的形式发布它。默认情况下,它会有公共的URL,能够由AJAX客户端调用,同时也能被SOAP客户端和工具发现和使用。但我们可禁用SOAP客户端和工具。为此,只需在web.config文件中添加以下设置:
webSevices
protocols
clear /
/protocols/webServices
这段简单的设置能禁用 Web服务定义的所有协议(包括SOAP),使该服务只能响应JSON请求。
注意,如果添加这些设置,则不能够通过浏览器的地址栏来调用Web服务,以便进行简单地测试。类似地,我们也不能为URL添加?wsdl后缀来调用WSDL.
Web服务方法的定义
客户端页面能够调用Web服务类中带有WebMethod特性的公共方法。在默认情况下,这些方法要通过HTTP动作POST来调用,以JSON对象的形式返回其值。我们可通过一个可选特性ScriptMethod来更改单个方法的默认设置。
ScriptMethod特性带有3个属性,见下表:
由于涉及安全性和性能问题,因谨慎使用ScriptMethod特性,下面的代码使用了该特性,但未修改默认设置:
[WebMethod][ScriptMethod]public DateTime GetTime(){
}
WebMethod特性是必选的,而ScriptMethod特性是可选的。
AJAX Web服务的注册
为在客户端发起对 Web服务的调用,我们只需要XMLHttpRequest、目标Web服务的URL和JSON流的管理功能。为方便起见,所有功能都包装在映射到远程编程接口的JavaScript代理类中。该代理类会由 AJAX框架自动生成,并注入到客户端。
为使内建的引擎生成所需的JavaScript代理和辅助类,我们应在需要AJAX Web服务的页面中,向脚本管理器控件注册该Web服务:
asp:ScriptManager ID="ScriptManager1" runat="server"
Services
asp:ServiceReference Path="~/WebServices/TimeService.asmx" /
/Services/asp:ScriptManager
对于每个要绑定到页面的Web服务,我们添加一个ServiceReference标签,将Path属性设为对应asmx资源的URL.对于每个服务引用,都会在客户端自动生成一个额外的script块。该脚本的URL指向一个系统HTTP处理程序,在内部调用以下URL:
~/WebServices/TimeService.asmx/js
追加到Web服务URL的/js后缀指示 AJAX运行库为指定的Web服务生成JavaScript代理类。如果页面处于调试模板,该后缀会被改为/jsdebug.
默认情况下,JavaScript代理通过script标签连接到页面,这样就需要单独下载。通过将ServiceReference对象InlineScript属性设置为true,我们还可以将任何所需的脚本并入当前页面。如果启用浏览器缓存,且多个Web页面使用相同的服务引用,那么默认值false更合适。在这种情况下,不论多少页面需要这个代理类,都只需执行一次请求。将InlineScript属性设为true会降低网络请求数,但会多占用一定的带宽。
如果以编程方式注册AJAX Web服务,我们使用类似以下的代码:
ServiceReference service = new ServiceReference();service.Path = "~/WebServices/TimeService.asmx";ScriptManager1.Services.Add(service);
不论采用哪种方式,为调用Web服务,我们只需通过JavaScript代理类发起调用即可。
使用应用程序来承托AJAX Web服务
为启用 AJAX应用程序中的Web服务调用,我们需要在web.config文件中添加以下内容以注册一个特殊的asmx请求HTTP处理程序:
httpHandlers
remove verb="*" path="*.asmx" /
add verb="*" path="*.asmx"
type="System.Web.Script.Services.ScriptHandlerFactory" /
/httpHandlers
该设置已包含在VS2008为支持AJAX的Web项目而创建的web.config文件中。
处理程序工厂(System.Web.Script.Services.ScriptHandlerFactory类)会选择负责处理给定类型请求的HTTP处理程序,且能通过Web服务调用中的脚本来识别JSON调用。基于JSON的请求由特殊的HTTP处理程序处理,而常规的SOAP调用会穿越管道。
AJAX Web服务的调用
被引用的 AJAX Web服务暴露给JavaScript代码的类名与服务器类名相同。代理类采用单例模式,暴露了外界调用的静态方法,无需实例化。
JavaScript代理类
以上述的timeservice.asmx生成的JavaScript代理类为例,让我们看看它的代码:
Type.registerNamespace('Core35.WebServices');Core35.WebServices.TimeService = function(){
Core35.WebServices.TimeService.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succceeded = null;
this._failed = null;}Core35.WebServices.TimeService.prototype ={
//调用GetTime方法
GetTime : function(succeededCallback, failedCallback, userContext)
{
//invoke参数分别为:
//Web Service URL路径
//Web Service方法名称
//
//传入方法的参数数组
//执行成功回调函数
//执行失败回调函数
//调用上下文对象
return this._invoke(Core35.WebServices.TimeService.get_path(),
'GetTime',
false,
{},
succeededCallback,
failedCallback,
userContext);
},
GetTimeFormat : function(timeFormat, succeededCallback, failedCallback, userContext)
{
return this._invoke(Core35.WebServices.TimeService.get_path(),
'GetTimeAsFormat',
false,
{format:timeFormat},
succeededCallback,
failedCallback,
userContext);
}}//注册Core35.WebServices.TimeService类,该类继承于.WebServiceProxyCore35.WebServices.TimeService.registerClass('Core35.WebServices.TimeService',
.WebServiceProxy);//创建一个JavaScript代理类实例Core35.WebService.TimeService._staticInstance = new Core35.WebServices.TimeService();
在JavaScript中调用WebService方法其实是通过最后创建的JavaScript代理类实现的:
Core35.WebService.TimeService.GetTime = function(onSuccess, onFailed, userContext){
Core35.WebService.TimeService._staticInstance.GetTime(onSuccess, onFailed, userContext);}Core35.WebService.TimeService.GetTimeFormat = function(onSuccess, onFailed, userContext){
Core35.WebService.TimeService._staticInstance.GetTimeFormat(onSuccess, onFailed, userContext);}
在这个代理类的定义中带有几个公共属性:
path属性用于定义Web服务的URL,我们可以编程方式更改该属性值,以便将代理重定向到其他URL.
远程调用的执行
下面是将JavaScript代理与客户端按钮点击关联的典型方法:
input type="button" value="Get Time" onclick="getTime()" /
按钮最好是客户端按钮,但也可以是服务器端Button对象生成的提交按钮,只要将OnClientClick属性设置为false的JavaScript代码即可,这会避免它执行默认的回发操作:
asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="getTime(); return false;" /
getTime函数用于采集必要的输入数据,并调用代理类中的静态方法。如果希望为回调或用户上下文对象赋予默认值,那么最好在pageLoad函数中进行。因为pageLoad函数会在客户端页面 AJAX成功初始化后调用,该函数比浏览器的onload事件更可靠。示例代码如下:
script language="javascript" type="text/javascript"
function pageLoad()
{
//设置默认的调用失败回调函数
Core35.WebServices.TimeService.set_defaultFailedCallback(methodFailed);
}
function getTime()
{
Core35.WebServices.TimeService.GetTimeFormat("ddd, dd MMMM yyyy [hh:mm:ss]", methodComplete);
}
function methodComplete(results, context, methodName)
{
$get("Label1")。innerHTML = results;
}
function methodFailed(errorInfo, context, methodName)
{
$get("Label1")。innerHTML = String.Format("Execution of method '{0}' failed because of the following:'{1}'",
methodName, errorInfo.get_message());
}/script
由于Web服务调用是以异步方式处理的,因而我们需要回调来处理调用成功和失败这两种情况。这两个回调的签名类似:
function method(results, context, methodName)
下表对各参数做了简要说明:
错误处理
failed回调会在服务器上的远程方法执行期间发生异常时被调用。在这种情况下,HTTP响应会包含HTTP错误码500(内部错误)。
在客户端,服务器异常通过JavaScript中的Error对象暴露,该对象会基于从服务器端获得的消息和堆栈跟踪而动态创建。Error对象会通过results参数暴露给failed回调。我们可通过Error对象的message和stackTrace属性来分别读取收到的消息和堆栈跟踪。
如果我们未指派默认的错误回调函数, AJAX会调用自己的默认回调函数,该回调函数会弹出一个带有服务器异常消息的消息框。
为用户提供反馈
虽然UpdatePanel中提供了异步调用的反馈机制(如UpdateProgress控件),但对于传统的远程方法调用,我们只能自行编写代码实现对用户的反馈。
我们可以在远程方法调用执行前显示等待消息、GIF动画或其他内容:
function takeaWhile(){
//显示等待消息
$get("Feedback")。innerHTML = "Please, wait ";
Core35.WebServices.MySampleService.VeryLengthyTask(methodCompletedWithFeedback, methodFailedWithFeedback);}
在completed回调中,我们首先重置用户界面,然后再进行其他操作:
function methodCompletedWithFeedback(results, context, methodName){
$get("Feedback")。innerHTML = "";
}
注意,在发生错误时,我们也要清除用户界面。
超时处理
如果发起对asmx Web服务的客户端调用,则是对asmx的直接调用。对于该请求,运行库中只有同步处理程序。也就是说,不论客户端如何检测当前调用是否正在进行,线程都会被完全阻塞,直到AJAX方法执行完毕。为此,我们可以设置超时时间:
Core35.WebServices.MySampleService.set_timeout(3000);
timeout属性是全局的,作用于代理类的所有方法。
如果请求超时,我们便不会从服务器收到响应,客户端只能单方面的撤销执行。

⑤ C#, WCF如何创建一个简单的服务器端和客户端程序

首先VS中的模板WCF SERVICE APP 项目,是一个承载到IIS的服务,用过web service就清楚,部署都差不多。

客户端引用wcf服务,知道url地址就行了,客户端添加服务引用,和添加以前的web service差不多。
客户端使用到服务端的数据模型,在服务端定义实体类时,添加 datacontract属性和datamember属性就ok.
推荐一些教程地址,可以选择了看看,你提到的这些问题在教程中都有涉及到。
1,WCF系列学习5天速成 http://www.cnblogs.com/huangxincheng/category/340145.html
2,WCF入门学习【Sheldon_Lou】http://www.cnblogs.com/sheldon-lou/category/648478.html
3,无废话WCF系列教程 http://www.cnblogs.com/iamlilinfeng/category/415833.html
4,WCF编程 http://www.cnblogs.com/zxj159/category/604460.html
5,WCF入门【停留的风】http://www.cnblogs.com/yank/category/568085.html
6,WCF初探【wangweimutou】http://www.cnblogs.com/wangweimutou/tag/WCF/
7,WCF【指尖流淌】http://www.cnblogs.com/jianliutang/category/277163.html
8,WCF【xfrog】---重点 http://www.cnblogs.com/xfrog/tag/WCF/

阅读全文

与wcf服务编程pdf下载相关的资料

热点内容
服务器端渲染的数据怎么爬 浏览:163
压缩空气喷射器 浏览:488
python提高效率 浏览:796
华为文件管理怎么样输入解压码 浏览:800
深思加密狗初始化 浏览:566
黄金崩溃pdf 浏览:309
华为特定短信息加密 浏览:375
微机原理与单片机技术李精华答案 浏览:816
pic12c508单片机 浏览:309
androidgps调用 浏览:226
金文编pdf 浏览:445
14乘87减147的简便算法 浏览:473
怎么创建edu文件夹 浏览:721
算法的基础问题 浏览:256
苹果手机怎么选择app支付 浏览:856
访问加密服务器失败怎么回事 浏览:439
程序员每天跑步5公里 浏览:789
党员对程序员有帮助么 浏览:550
慢跑穿压缩衣还是紧身衣 浏览:214
什么服务器引擎最好 浏览:497