没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记105(2004)133-145www.elsevier.com/locate/entcs业务流程曼努埃尔·马扎拉和罗伯托·卢基博洛尼亚大学计算机科学系,意大利博洛尼亚,Via Mura Anteo Zamboni 7-电子邮件:{mazzara,lucchi}@ cs.unibo.it摘要最近,术语Web服务编排已经被引入来解决与Web服务组合相关的一些问题。在过去的几年里,已经提出了几个描述业务流程编排的建议,其中许多语言使用了长时间运行的事务和补偿的概念来处理错误处理。BPEL 4WS是最有可能成为编排标准的候选者,它提供了三种不同的机制来处理异常情况:异常处理、事件处理和补偿处理。BPEL4WS的复杂性使得很难正式定义这个框架,从而限制了对所设计的应用程序的正式推理。在本文中,我们主张三种不同的错误处理机制是不必要的,我们形式化一种新的编排语言,基于事件通知作为唯一的错误处理机制的想法。 我们可以从两个方面利用这种形式描述。 首先,这种语言本身代表了一种简化BPEL 4WS的建议,包括一个明确的规范。其次,实际的BPEL4WS编排引擎的实现者应该简单地实现这个单一的机制,通过编译提供所有剩余的机制。值得注意的是,所提出的框架具有足够的表现力,可以比较用于管理长时间运行的事务的不同解决方案,如BPEL4WS和StAC。关键词:Web服务编排,Web服务组合,业务流程,异常处理,事件处理,补偿处理。1介绍Web服务技术是一个平台,我们可以在其上开发利用互联网基础设施的应用程序。Web服务,具体来说,描述了公司希望通过互联网公开的特定业务功能,目的是为其他公司提供使用它们的方法。更正式地说,W3C的官方定义[14]说:1571-0661 © 2004 Elsevier B. V.根据CC BY-NC-ND许可证开放访问。doi:10.1016/j.entcs.2004.05.002134M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133Web服务是由URI标识的软件系统,其公共接口和绑定使用XML定义和描述。它的定义可以被其他软件系统发现。然后,这些系统可以按照其定义所规定的方式与Web服务进行交互,使用由Internet协议最近,术语Web服务编排(Web Services Choreography)被引入来识别Web服务组合,这是从简单服务中定义复杂服务的方法。在过去的几年里,已经提出了几个描述业务流程编排的建议:例如BPML [4],IBM编排是关于业务流程的。重要的是要注意,业务流程的特征在于:(1)持续时间长,(2)使用异步消息进行通信,(3)操纵后端数据库中的敏感业务数据。在这样的环境中,错误处理既困难又关键。ACID事务的使用可能仅限于本地更新,因为存在信任问题,而且锁和隔离无法长时间维护。我们将具有这些不同需求的事务称为长时间运行的事务。在这种情况下,错误处理依赖于补偿的概念。开头列出的大多数Choreography语言都使用长时间运行的事务和补偿作为描述松耦合活动的机制。补偿是特定于应用程序的活动,它试图逆转作为被放弃的更大工作单元的一部分而执行的先前活动的效果。对于数据库中的ACID事务,事务协调器及其控制的资源知道所有未提交的更新,并完全控制它们必须被逆转的顺序,而对于业务事务,补偿行为本身就是业务逻辑的一部分,必须显式指定。在本文中,我们要解决的问题,在一个正式的方式,组成Web服务,特别注意错误处理。特别是,我们提出了一个基本的语言来处理编排。这种语言的目的是提供一种方法来表达常见的Web服务需求。通常,在这样的环境中,我们需要一种方法来解决并发性和消息传递,形成了互联网上的分布式计算的基本范例。为了正式地处理这些要求,我们选择从π-演算开始[12],这是一个众所周知的进程代数,在过去的14年中得到了我们选择π演算而不是其他演算,因为XLANG(然后是π)的定义已经被M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133135强烈地受到这种微积分的影响。一个如此理论和学术的领域与一个更面向商业的领域之间的强烈相关性不应该像许多人认为的那样令人惊讶。这是因为参与第二种方法的一部分人以前参与过第一种方法,在选择一种有效的编舞语言范式时,他们决定使用一种已经深入实验的范式,例如π演算。对于汽车的发明来说,这似乎是完全自然的:实现这种交通工具的更自然的方式是将已经试验过的交通工具作为长途汽车加以改进。在水池上安装一个引擎会导致一个奇怪的实验,尽管很有趣!不幸的是,最初的π演算不支持任何事务机制。出于这个原因,在本文中,我们将以这种方式扩展基本演算,以包括交易设施。在过去已经提出了一些其他的作品来解决类似的问题。无论如何,所有过去的工作只致力于ACID或长时间运行的语义,而没有提供一个通用的框架,形式化的语义。相反,我们的尝试可以从这个方向来解释。在本文件中,我们将按以下方式进行。在第2节中,我们描述了布里布里塞成为编舞标准的最认可的候选人,我们解释和激励我们的目标。在第三节中,我们介绍了语言的语法,在第四节中,我们介绍了它的语义。在第5节中,我们将非正式地展示如何在我们的框架中对BPEL4WS提供的错误处理机制进行编程。最后,在第6节中,我们描述了一些相关的工作,我们报告了一些结论性的意见。2WS编舞的最新发展Web服务的业务流程执行语言(BPEL4WS)是IBM的WSFL和Microsoft的XLANG的融合到目前为止,它代表了最受认可的候选者,成为Web服务编排领域的未来标准。因此,它值得研究,并被视为这一领域任何进一步成就的试金石。BPEL4WS(简称BPEL)实际上是WSDL [7]之上的一层。粗略地说,WSDL用于定义消息类型和端口类型;这样的消息和端口然后被WSDL用于指定操作的流程。XML文档是一种基于XML的文档,可以由作为中央协调器的演示引擎执行。引擎将读取XML文档,并按照所需的顺序调用必要的Web服务。流程本身将作为Web服务进行操作,136M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133以这样的方式召唤。完整的解释是超出了本文的目的。无论如何,重点是它提供了三种不同的机制来处理异常情况:异常处理,事件处理和补偿处理。在本文中,我们主张,三种不同的错误处理机制是不必要的,我们形式化一种新的编排语言的基础上的事件通知的想法作为唯一的错误处理机制。我们可以从两个方面利用这种形式描述首先,这种语言本身代表了一种简化的建议,包括一个明确的规范。第二,实际业务流程编排引擎的实现者应该简单地实现这个单一的机制,通过编译提供所有剩余的机制。值得注意的是,事件处理机制并不是专门为错误处理而设计的虽然这不是这项工作的目标,但我们认为所提出的语言仍然允许原始机制的所有剩余用法为了证明所提出的机制的充分性,在第5节中,我们将非正式地展示如何在我们的框架中编程由XML提供的三种机制。 任何形式上的比较都超出了本文的范围,它将作为未来的工作。 反正值得一提的是,要更精确地与《公约》进行比较是一项艰巨的任务,因为目前它缺乏任何正式的规范。3语言语法设N是通道名称的集合,T是作用域名称的集合。过程的集合,由P,Q,R,…由以下语法定义:P::=0正常终止| xv. P输出| x(u).P输入| (n)P新名称创建| P|P并行执行| A(u)进程调用| 信号(t)信号的升起| [P,Q].R活动范围M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133137当n是N 中的一个名称时,v表示N中的一个列表{this},u∈T{this}. 术语this是表示当前事件范围的标识符的关键字。的关键字必须在主体中唯一使用一个作用域定义,我们将在下面定义这种良好格式的概念。为了支持过程定义,我们假设一组过程常数,范围为A,其定义如下:定义3.1(过程定义)过程标识符A的定义方程为:defA(u)=P前五个运算符和往常一样:0简单地描述了一个过程的正常终止。 这是一个O utputxvn。P是通过通道X发送列表V,通信的对象,主体。输入前缀x(u)。P表示通过通道x接收到的对象,并且它是针对n个用户名∈ N的绑定(这些用户名可以是通道名或作用域名)。相反,New NameCreation 操 作 符 是 名 称n∈ N 的 绑 定 器 。 parallel 操 作 符 将 对 concur-parallel的支持表示为parallel中的流活动就像在《星球大战》里一样,这里的世界通过消息传递和事件引发进行交互的并发活动。JavaScript允许Web服务组合提供调用活动。同样,在通信过程中,π-C算法也包含许多不同的非耦合服务。到目前为止,该语言严格类似于π-演算,它只对最后两个运算符有区别。第一个是signal(t),它产生一个指向由t标识的事件作用域的信号。假设每个事件范围[P,Q]由范围名称标识(例如,范围[P,Q]t由t)标识,它在执行过程中确定(more在分配范围的时候)。这将在下面显示语义规则时清楚。现在,有必要理解事件作用域定义了在正常执行期间运行的进程P和事件处理程序Q。在执行过程中,当一个作用域被打开时,定义的处理程序被分配。在这一点上,标识符与范围相关联。系统将此信息提供给作用域的主体,该主体可以使用关键字this引用此标识符。 如果一些并行运行的进程将引发指向它的信号,即事件处理程序最终将被执行(由于物理延迟,激活是异步的),然后进程本身终止。指向不存在作用域的信号丢失。这一事实的直接后果是,示波器只能捕获一次信号。我们定义一个过程P的自由名fn(P),就像在π演算中对信号(t)和[P,Q]进行必要的扩展一样。R:138M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133f n([P,Q].R)=f n(P)<$f n(Q)<$f n(R),f n(signal(t))={t}.在下一节中,我们将给出格式良好的进程的语义,其定义如下。定义3.2(良构过程)如果下列条件成立,则过程是良构的:(i) 对于每种情况定义,它都包含A(u),def=P它保持fn(P)<${u<$}并且u由成对不同的名称组成,(ii) 关键字this永远不会出现在作用域定义的主体P[P,Q].R.我们用P来表示良构过程的集合。4语言语义学在我们的语言中,所有的作用域都有一个唯一的标识符。这个标识符的知识对于一个过程能够与先前分配的范围正确交互是至关重要的。当范围内的主进程终止时,相关事件处理程序也会被删除,然后它变得不可访问。实际上,流程有两种交互方式:(1)消息传递和(2)事件引发。不难理解这两种机制是相互编码的。无论如何,这里的目标不是语言的最小化,而是提供在抽象级别上描述Web服务编排语言所需的所有重要方面的机制 请注意,这句话并不与我们之前关于故障处理的冗余机制的声明相矛盾。实际上,我们正在寻找能够满足Web服务编排操作所需要求的最小操作符集对应用程序设计者来说是一个合理的简单性。仅从消息传递的角度使用故障处理来编程复杂的业务流程似乎是不合理的。有了这个动机,我们声称-在这种情况下-添加一个事件处理机制是必要的和足够的。一个程序,静态地,可以被看作是一个嵌套作用域的树。相反,在执行过程中,每个作用域都提供了一个标识自身的索引,并被挤出创建一个可扩展的结构。它没有提供另一个索引来标识嵌套作用域的祖先树中的父亲。最初,我们也在语言中引入了这些信息;无论如何,值得注意的是,避免引入这些信息对语言来说是一个重大的优势,因为它简化了业务流程的定义,M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133139语义规则。然而,它似乎并没有增加业务流程阶段编程的复杂性。在给出语言的语义之前,我们必须正式定义系统状态的概念,这是动态处理作用域标识符所必需的。定义4.1(系统状态)系统状态的集合S定义如下:S::= P| [P,Q] t|S|S其中t ∈ T。[P,Q]t的预期含义是标识在运行时与标识符t相关联的作用域[P,Q]。如将在下文中清楚的(参见表1),该分配是通过用新名称t替换关键字this来获得的。 我们通常用P{t/this}表示这种特殊的替换情况,但定义略有不同:我们将其定义为在过程P中出现的外部作用域的主体中,每次出现名称为t的关键字this的替换。在分配相应的作用域时,将以相同的方式替换剩余的发生率。 现在,我们将自由名称的定义扩展到系统状态只增加一个规则:如果S是[P,Q] t的形式,我们定义f n([P,Q]t)=(f n(P)<$f n(Q))\{t}.现在我们将按照Milner [11]的方法,分两步给出语言的语义这种方法在于把支配过程之间静态关系的定律与支配过程之间相互作用的定律分开。我们将首先定义句法过程上的静态结构一致关系来实现这一点。一个结构同余关系的过程中引入了一个小集合的公理,允许轻微的操作过程的结构。这个关系是用来表达运算符的一些内在含义,例如parallel是可交换的。第二,我们将通过一个标记转移系统来定义状态动态演化的方式。这样做,我们简化了转移系统的陈述,只是在表1中添加了(CONGR)规则,该规则关闭了由结构同余引起的过程顺序操纵下的转移关系。定义4.2(结构同余)过程的结构同余是满足以下条件的最小等价关系,并且关于α-重命名,并行合成和限制是封闭的140M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133α(i) (P,|,0)是阿贝尔幺半群:p 1P 2-P 2|P1交换性|(P1)|P2)|P1|(P2)|P3)结合性P|0P0是nil元素(ii) (n)0万0(iii)(n1)(n2)P(n2)(n1)P(iv)(n)(P1|P2)P1|(n)P2如果n/∈fn(P1)def(v)A(v)P{v/u}如果A(u)=P在下一个定义中,我们使用了命名子序列P{v_n/u_n}的通常表示,这意味着在过程P中,用顺序序列v_n中的对应命名替换顺序序列u_n中的每个出现的名称。在下面的定义中,我们将考虑过程的阿贝尔幺半群规则的自然属性。有时候,系统的语义是用一个归约关系来定义的,这样可以得到更简洁的结果。出于这个目的,我们最初也试图用归约关系来定义我们的语义。无论如何,后来我们发现了一个标记的转换系统,一个更优雅的方式来描述信号的提升,作用域的产生和作用域间的交互。出于这个原因,我们决定以这种方式表达语义,尽管它缺乏简洁性。系统状态之间的转移关系由动作来标识。我们有四种行动,定义如下:定义4.3(动作)动作由下式给出:α::=xv|x(u)|⟨t⟩|τ我们将为这组动作编写Act第一个是通过通道x结束更新,第二个是接收元组,而第三个是指向事务t的信号。最后,τ代表一种内部作用。我们省略了f n(α),bn(α)和subj(α)的定义。它们分别代表行动的自由名称,绑定名称和名称作为主题出现在一个communic- ation的集合。这些定义与通常的信号标签的直接扩展一样。定义4.4(转换关系)转换关系{−→|表1中的规则定义了状态S上的α∈Act},其中S−α→S J表示状态S在S j中以作用量α演化。M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133141关于所提出的语义学,有三点值得一提。首先,请注意,我们挤出嵌套事务的机制与Ambient Calculus [5]中的out操作非常相似。转换系统的作用域规则也反映了环境演算的作用域规则。这里的区别在于,我们的挤出是隐式的,而不是显式编程的。因为这种显式挤出事务的自由在Web服务的上下文中似乎没有附加值,所以我们决定不允许它让系统以这样一种方式控制演化,即在运行时,它们都处于相同的嵌套级别。第二点是关于地点。在这里,我们决定避免在语言中引入这个概念,以便尽可能接近XML中的事务概念。事实上,重要的是要记住,在Oracle中,LongRunning Transaction的概念是纯本地的,并且发生在单个业务流程实例中[1]。在多个参与者之间不存在关于结果的分布式协调。达成一项分配协议是一个不属于联合国范围的问题这个问题可以通过使用WS-Transaction [15]规范中描述的协议来解决值得注意的是,由于组合WS-Transaction和XML的需要目前已被广泛认可,并且我们的事务概念似乎在具有局部性的进程代数的上下文中非常匹配[6],因此本研究的下一步应该包括在语言中引入局部性的概念。最后,我们要注意的是,规则(ScopeAlloc)和(ScopeExtr)的执行在整个系统中生成新的名称。一些读者可以强调这样一个事实,即相对副条件可以更严格地表达。无论如何,我们的目标是保持规范尽可能的轻,而不缺乏精度,因为我们的语义是面向实现的,这个解决方案代表了一个合理的权衡。5语用失误处理在这个基于事件的框架中,可以很容易地编程异常处理、带补偿处理程序的嵌套事务和事件处理等机制。在本节中,我们将通过示例展示如何用我们的语言编程这些机制中的前两个,而第三个是直接的。最后,应该立即发现,在这种单一错误处理机制中实现故障恢复业务流程既简单又有效。142M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133不tt−→ts(OuT)xv(In)x(u)(信号)⟨t ⟩xv. P−→P(LOCAL COM)x(u)。P−→P(PAR)Signal(t)−→0P−x→vPJQx(u)QJSJ−α→SJJbn(α)<$fn(S)=<$P|Q−→(RES)S−α→SJPJ|QJ{v/u}n/∈subj(α)SJ|S−α→SJJ|S(鼓掌)S<$SjSJ−α→SJJSj<$S JJJ(n)S−α→(n)S J(CATCH)S−α→S JJJ(AuTORAISING)⟨t⟩R−→R⟨t⟩P−→P[P,Q]t | R−→τQ|RJ[P,Q]⟨t⟩t−→Q(SCOPEALLOC)[P,Q]. R|S−τ→(SCOPE ExTR)[[P,Q]. R|PJ,QJ]|S−τ→(SCOPE)[P{t/this},Q]t|R |S·T鲜[P {tJ/this},Q]tJ|[R |P J,QJ]t|很新鲜(NON LOCAL COM)P−α→PJ[P,Q]−α→[PJ,Q]α/=αtP|PJ−τ→[P,Q]|[PJ,QJ]−τ→PJJ|PJJJ{v$>/u$>}[PJJ,Q] t|[PJJJ{v/u},QJ] s表1标记转换系统5.1嵌套事务在XML中,每个事务都有一个范围。在我们的语言中,事务作用域可以使用事件作用域编程,其中事件处理程序表示补偿处理程序。在这种情况下,可以编程中止,作为指向示波器本身的信号例如,一个简单的模式是以下内容:[signal(this),Q]. 0其中事件处理程序Q必须提供补偿机制。这种机制必须由程序员单独决定,因为它是业务逻辑本身的一部分。τJJM. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133143在我们的语言中,我们可以编程由JavaScript支持的补偿激活机制,其中补偿处理程序以相反的顺序被调用。事实上,我们可以嵌套尽可能多的作用域,为外部作用域提供有关其包含的作用域的信息,例如,限制信道以避免干扰。当最里面的事件处理程序的逻辑被执行时,它必须引发一个指向父事件的事件在这一点上,父亲必须捕捉这个事件,用一个足够的补偿处理程序来管理它,最后,必须为父亲引发相同的事件,以此类推,传播信号直到到达根。让我们考虑以下基本模式,它允许信号从内部事务传播到外部事务:(x)([[signal(this),x(r).signal(r)]. 0|x这个,Q]。0个)在这个例子中,我们有嵌套的事务,其中内部事务激活它的处理程序,该处理程序在受限通道上接收外部事务的名称以激活它的处理程序Q。很容易理解,通过这种方式,我们可以像嵌套事务的通常语义那样5.2异常处理异常处理机制tryP catchQ的语义可以使用事件作用域作为异常的作用域通常,一个exception是由一个thrown原语激活的:tryP catchQ意味着,如果一个thrown被P执行,那么P被终止,Q被执行。 在我们框架在作用域主体内引发异常意味着简单地向其自身发出事件信号。事件将由在受限通道上的会合触发。这里我们将抛出的构造编程为x.x()。 输出x表示触发器本身,而输入x()对于阻止P是必要的,以避免在执行信号(this)之前的不正确的交织。 值得注意的是,该解仅在P是序列过程的情况下才是正确的。支持并行组合的扩展可以简单地通过为每个并行组合的进程定义一个事件范围,实现事件处理程序之间的同步,以便激活异常处理程序。所述行为的模式如下:[(x)(P)|x()。信号(this)),Q]。0值得注意的是,嵌套事务允许我们捕获多种异常。144M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)1336结论和今后的工作该语言的规范描述了处理异常情况的三种不同机制:异常处理,事件处理和补偿处理。所有这些复杂性使得形式上定义语言变得困难,从而限制了对设计应用程序的形式化推理相反,拥有一个小的语言可以实现形式化的目标。在本文中,我们认为三种不同的错误处理机制是不必要的,并使语言定义过于复杂。因此,我们形式化了一种新的编排语言,扩展了π演算,基于事件通知作为唯一错误处理机制的思想我们的编排可以被认为是一个简化编排的建议,从而简化编排引擎的实现者以及应用程序设计者。为了支持这篇论文,我们提出了一些例子来解释如何使用我们的框架编程的机制任何形式上的比较都将留待以后进行。我们应该强调这样一个事实,即使我们的语言试图处理我们所指的语境中典型的通信的复杂性,消息传递机制也是π演算的同步版本中提出的机制这是因为我们认为,应该在事件引发的级别而不是消息传递的级别上考虑安全性无论如何,呈现这种语言的异步变体是很简单的我们认为,所提出的语言共享的一些功能,与STAC和STAC[3],他们都可以被视为在同一层次的程序设计抽象。在未来,我们打算通过利用我们的语言来研究这些建议的表达性(例如πt-演算[2]),我们认为我们的语言足够灵活,可以以简单的方式编码文献中可用的最具交互性的建议。我们要指出的是,对灵活性和优雅性特别有利的一点在于我们动态地识别和处理作用域分配的方式。我们的机制是π演算中存在的名称移动性的扩展,以便也包括范围标识符的运行时处理。我们想要解决的其他关键问题是验证和行为类型系统[9]。应该清楚的是,我们在本文中提出的语言强烈致力于π演算。这个理论在过去几年中得到了深入的研究,并且人们普遍认为,引入并发类型在程序语义分析方面有一定的好处。事实上,像我们遵循的理论方法可以导致验证器,其中类型系统不仅可以检查数据类型匹配,而且可以检查使用某些通道(发送和接收数据)的过程是否遵守这些消息(以及这些通道)的给定协议。几部文学作品M. 马扎拉河Lucchi/Electronic Notes in Theoretical Computer Science 105(2004)133145表明,在这个框架中检查分布式编程中的关键属性是可能的,在编译时。事实上,进程代数的行为类型系统允许我们确保进程具有无死锁或遵守特定协议的特定属性。引用[1] Tony Andrews,Francisco Curbera等人,《用于Web服务规范的流程执行语言》,1.1版,2003年5月5日。[2] L.Bocchi,C.Laneve,G.Zavattaro -一个长期运行事务的演算。FMOODS LNCS。[3] Michael Butler,Carla Ferreira:StAC的操作语义学,一种建模长期运行紧急事务的语言。将出现在《2004年协调》中。[4] 紧急过程建模语言(BPML)www.bpmi.org。[5] L.Cardelli,A.D.Gordon -Mobile Ambients.软件科学和计算结构的基础:第一次国际会议,FOSSACS[6] 具有局部性的Castelani -Process代数Handbook of Process Algebra - Edited by J.A. Bergstra,A.Ponse,S.A. Smolka - Elsevier 2001.[7] 作者:E.Christenses,F.Curbera,G.Meredith,S. Weerawarana.Web服务描述语言(WSDL 1.1)www.w3.org/TR/wsdl,W3C,注15,2001年。[8] F. Leymann -Web服务流语言(WSFL 1.0)www-4.ibm.com/software/solutions/webservices/pdf/WSFL.pdf网站。[9] Atsushi Igarashi,Naoki Kobayashi-一个π-演算的通用类型系统。ACM Symposium Conferenceon Principles of Programming Languages(POPL),2001年。[10] Microsoft Corp. Biztalk Server -http://www.microsoft.com/biztalk。[11] R.米尔纳-函数作为过程。Mathematical Structures in Computer Science,2(2):119-141,1992.[12] Robin Milner,Joachim Parrow,David Walker -移动过程的微积分.信息与计算杂志,100:1-77。中国科学院出版社,1992年.[13] S.Thatte -XLANG:Web Services for urgnes Process Designwww.gotdotnet.com/team/xml/wsspecs/xlang-c微软 公司,2001年。[14] 万维网联盟(W3C)-http://www.w3.org。[15] WS-Transaction Specification-http://www.w3.org。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功