ASP.NET教程之SOAP协定标准(一)
据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。标准SOAP协定标准1.简介
SOAP以XML情势供应了一个复杂、轻量的用于在分离或散布情况中互换布局化和范例信息的机制。SOAP自己并没有界说任何使用程序语义,如编程模子或特定语义的完成;实践上它经由过程供应一个有尺度组件的包模子和在模块中编码数据的机制,界说了一个复杂的暗示使用程序语义的机制。这使SOAP可以被用于从动静传送到RPC的各类体系。
soap包含三个部分
soap封装(见第4节)布局界说了一个全体框架用来暗示动静中包括甚么内容,谁来处置这些内容和这些内容是可选的或是必须的。
SOAP编码划定规矩(见第5节)界说了用以互换使用程序界说的数据范例的实例的一系列机制。
SOAPRPC暗示(见第7节)界说了一个用来暗示远程历程挪用和应对的协议。
固然这三个部分都作为SOAP的一部分一同形貌,但它们在功效上是订交的。出格的,封装和编码划定规矩是在分歧的名域中界说的,这类模块性的界说办法增添了复杂性在SOAP封装,SOAP编码划定规矩和SOAPRPC协议以外,这个标准还界说了两个协定的绑定,形貌了在有或没有HTTP扩大框架的情形下,SOAP动静怎样包括在HTTP动静中被传送。
1.1计划方针
SOAP的次要计划方针是复杂性和可扩大性,这意味着传统的动静体系和散布工具体系的某些性子不是SOAP标准的一部分。这些性子包含:
散布式碎片搜集
成批传送动静
工具援用(请求散布式碎片搜集)
激活机制(请求工具援用)
1.2标记商定
这篇文章中的关头字"MUST","MUSTNOT","REQUIRED","SHALL","SHALLNOT","SHOULD","SHOULDNOT","RECOMMENDED","MAY",和"OPTIONAL"的注释在RFC-2119中。这篇文章顶用到的名域前缀"SOAP-ENV"和"SOAP-ENC"分离与"http://schemas.xmlsoap.org/soap/envelope/";和"http://schemas.xmlsoap.org/soap/encoding/";联系关系。整篇文档中,名域前缀“xsi”被假定为与URI"http://www.w3.org/1999/XMLSchema-instance“(在XMLSchema标准界说)相连。相似的,名域前缀”xsd“被假定为与URI"http://www.w3.org/1999/XMLSchema";(在中界说)相连。名域前缀”tns“用来暗示恣意名域。一切别的的名域前缀都只是例子。
名域URI的基础情势”some-URI“暗示某些依附于使用程序或高低文的URI。这个标准用扩大BNF(在RFC-2616形貌)形貌某些布局。
1.3soap动静举例
在这个例子中,GetLastTradePriceSOAP哀求被发往StockQuote服务。这个哀求照顾一个字符串参数和ticker标记,在SOAP应对中前往一个浮点数。XML名域用来辨别SOAP标记符和使用程序特定的标记符。这个例子申明了在第6节中界说的HTTP绑定。假如SOAP中办理XML负载的划定规矩完整自力于HTTP是没成心义的,由于现实上该负载是由HTTP照顾的。在AppendixA中有更多的例子。
例1在http哀求中嵌进soap动静
post/stockquotehttp/1.1
Host:
www.stockquoteserver.com
Content-Type:text/xml;
charset="utf-8"
Content-Length:nnnn
SOAPAction:
"Some-URI"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/";>
<SOAP-ENV:Body>
<m:GetLastTradePricexmlns:m="Some-URI">
<symbol>DIS</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
上面是一条应对动静,包含http动静,soap动静是其详细内容:
例2在http应对中嵌进soap动静
http/1.1200ok
Content-Type:text/xml;
charset="utf-8"
Content-Length:
nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/";/>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponsexmlns:m="Some-URI">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
2.soap动静互换模子
SOAP动静从发送方到吸收方是单向传送,但正如下面显现的,SOAP动静常常以哀求/应对的体例完成。SOAP完成能够经由过程开辟特定收集体系的特征来优化。比方,HTTP绑定(见第6节)使SOAP应对动静以HTTP应对的体例传输,并利用统一个毗连前往哀求。不论SOAP被绑定到哪一个协定,SOAP动静接纳所谓的”动静路径“发送,这使在终节点以外的两头节点能够处置动静。一个吸收SOAP动静的SOAP使用程序必需按按次实行以下的举措来处置动静:辨认使用程序想要的SOAP动静的一切部分(见4.2.2节)查验使用程序是不是撑持第一步中辨认的动静中一切必须部分并处置它。假如不撑持,则抛弃动静(见4.4节)。在不影响处置了局的情形下,处置器大概疏忽第一步中辨认出的可选部分。假如这个SOAP使用程序不是这个动静的终极目标地,则在转发动静之前删除第一步中辨认出来的一切部分。为了准确处置一条动静大概动静的一部分,SOAP处置器必要了解:所用的互换体例(单向,哀求/应对,多路发送等等),这类体例下吸收者的义务,RPC机制(假如有的话)的利用(如第7节中所述),数据的体现办法或编码,另有别的必须的语义。只管属性(好比SOAPencodingstyle,见4.1.1节)能够用于形貌一个动静的某些方面,但这个标准其实不强迫一切的吸收方也必需有一样的属性并取一样的属性值。举个例子,某一特定的使用大概晓得一个元素暗示一条遵守第7勤俭定的RPC哀求,可是别的一些使用大概以为指向该元素的一切动静都用单向传输,而不是相似第7节的哀求应对形式。
(译者注:交互两边的SOAP动静其实不必定要遵守一样的格局设定,而只必要以一种两边可了解的格局互换信息就能够了)
3.与xml的干系
一切的SOAP动静都利用XML情势编码(更多有关XML的信息请见)一个SOAP使用程序发生的动静中,一切由SOAP界说的元素和属性中必需包含准确的名域。SOAP使用程序必需可以处置它吸收到的动静中的SOAP名域(见4.4节),而且它能够处置没有SOAP名域的SOAP动静,就象它们有准确的名域一样。SOAP界说了两个名域(更多有关XML名域的信息请见)
soap封装的名域标记符是"http://schemas.xmlsoap.org/soap/envelope/";
SOAP的编码划定规矩的名域标记符是"http://schemas.xmlsoap.org/soap/encoding/";
SOAP动静中不克不及包括文档范例声明,也不克不及包含动静处置指令。SOAP利用"ID"范例"id"属性来指定一个元素的独一的标记符,同时该属性是部分的和无需校验的。SOAP利用"uri-reference"范例的"href"属性指定对这个值的援用,同时该属性是部分的和无需校验的。如许就服从了XML标准,XMLSchema标准和XML毗连言语标准的作风。除SOAPmustUnderstand属性(见4.2.3节)和SOAPactor属性(见4.2.2节)以外,一样平常同意属性和它们的值呈现在XML文档实例或Schema中(二者效果不异)。也就是说,在DTD或Schema中声明一个缺省值或流动值和在XML文档实例中设置它的值在语义上不异。
4.soap封装
SOAP动静是一个XML文档,包含一个必须的SOAP封装,一个可选的SOAP头和一个必须的SOAP体。在这篇标准残剩部分中,提到SOAP动静时就是指这个XML文档。这一节中界说的元素和属性的名域标记符为:
"http://schemas.xmlsoap.org/soap/envelope/";。一个SOAP动静包含以下部分:1.在暗示这个动静的XML文档中,封装是顶层元素。2.使用SOAP互换信息的各方是分离的且没有事后协议,SOAP头供应了向SOAP动静中增加关于这条SOAP动静的某些要素(feature)的机制。SOAP界说了大批的属性用来标明这项要素(feature)是不是可选和由谁来处置。(见4.2节)3.SOAP体是包括动静的终极吸收者想要的信息的容器(见4.3节)。SOAP为SOAP体界说了一个Fault元素用来呈报毛病信息。语律例则以下所示:
封装
元素名是"envelope"
在SOAP动静中必需呈现。
能够包括名域声明和附加属性。假如包括附加属性,这些属性必需限制名域。相似的,"Envelope"能够包括附加子元素,这些也必需限制名域且跟在SOAP体元素以后。
SOAP头(见4.2节)
元素名是"header"
在SOAP动静中大概呈现。假如呈现的话,必需是SOAP封装元素的第一个间接子元素。
SOAP头能够包括多个条目,每一个都是SOAP头元素的间接子元素。一切SOAP头的间接子元素都必需限制名域。
SOAP体(见4.3节)
元素名是"body"
在SOAP动静中必需呈现且必需是SOAP封装元素的间接子元素。它必需间接跟在SOAP头元素(假如有)以后。不然它必需是SOAP封装元素的第一个间接子元素。
SOAP体能够包含多个条目,每一个条目必需是SOAP体元素的间接子元素。SOAP体元素的间接子元素能够限制名域。SOAP界说了SOAPFault元从来暗示毛病信息。
4.1.1SOAPencodingstyle属性
Encodingstyle全局属性用来暗示SOAP动静的序列化划定规矩。这个属性能够在任何元素中呈现,感化局限与名域声明的感化局限很类似,为这个元素的内容和它的一切没有重载此属性的子元素。SOAP动静没有界说缺省编码。属性值是一个或多个URI的按次列表,每一个URI断定了一种或多种序列化划定规矩,用来分歧水平反序列化SOAP动静,举比方下:
"http://schemas.xmlsoap.org/soap/encoding/";
"http://my.host/encoding/restrictedhttp://my.host/encoding/";
""
第5节中界说的序列化划定规矩由uri"http://schemas.xmlsoap.org/soap/encoding/";断定。利用这个特定序列化划定规矩的动静应当用encodingstyle属性申明这一点。别的,一切以"http://schemas.xmlsoap.org/soap/encoding/";开首的URI中的序列化划定规矩与第5节中界说的SOAP编码划定规矩相分歧。一个零长度的URI("")明白显现所含元素没有任何编码情势。这能够用来作废上一级元素的一切编码声明。
4.1.2封装版本模子
SOAP没有界说惯例的基于主版本号和辅版本号的版本情势。SOAP动静必需有一个封装元素与名域"http://schemas.xmlsoap.org/soap/envelope/";联系关系。假如SOAP使用程序吸收到的SOAP动静中的SOAP封装元素与其他的名域联系关系,则视为版本毛病,使用程序必需抛弃这个动静。假如动静是经由过程HTTP之类的哀求/应对协定收到的,使用程序必需回覆一个SOAPVersionMismatch毛病信息(见4.4节)。
4.2soap头
SOAP为互相通讯的整体之间供应了一种很天真的机制:在不必事后协议的情形下,以分离但尺度的体例扩大动静。能够在SOAP头中增加条目完成这类扩大,典范的例子有认证,事件办理,付出等等。头元素编码为SOAP封装元素的第一个间接子元素。头元素的一切间接子元素称作条目。条目标编码划定规矩以下:
一个条目有它的完全的元素名(包含名域uri和部分名)断定。soap头的间接子元素必需着名域限定。
SOAPencodingstyle属性能够用来唆使条目所用的编码情势(见4.1.1节)
SOAPmustUnderstand属性(见4.2.3节)和SOAPactor属性(见4.2.2节)能够用来唆使怎样处置这个条目和由谁来处置。(见4.2.1节)
4.2.1利用头属性
这一节中界说的SOAP头属性断定了SOAP动静的吸收者应当如何按第2节中所述的体例处置动静。发生SOAP动静的SOAP使用程序,应当仅仅在SOAP头元素的间接子元素中利用这些SOAP头属性。SOAP动静的吸收者必需疏忽一切不在SOAP头元素的间接子元素中SOAP头属性。上面的例子是一个SOAP头,包含一个元素标记符"Transaction","mustUnderstand"取值为"1"和数值5。这应当以以下体例编码:
<soap-env:header>
<t:Transaction
xmlns:t="some-URI"SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
4.2.2soapactor属性
一个SOAP动静从始节点到终节点的过程当中,大概沿着动静路径经由一系列SOAP两头节点。一个SOAP两头节点是一个能够吸收转发SOAP动静的使用程序。两头节点和终节点由URI辨别。大概SOAP动静的终节点其实不必要一切部分,而在动静路径上的一个和几其中间节点大概必要这些内容。头元素的吸收者饰演的脚色相似于一个过滤器,避免这些只发给本承受者的动静部分分散到别的节点。即一个头元素的吸收者必需不转发这些头元素到SOAP动静路径上的下一个使用程序。一样的,吸收者大概拔出一个类似的头元素。SOAPactor全局属性能够用于唆使头元素的吸收者。SOAPactor属性的值是一个URI。
uri"http://schemas.xmlsoap.org/soap/actor/next";指出了第一个处置这个动静的SOAP使用程序必要这个头元素。这相似于HTTP头顶用Connection域暗示hop-by-hop局限模子。省略SOAPactor属性暗示吸收者是SOAP动静的终节点。假如这个属性要失效,它必需呈现在SOAP动静实例中。(见第3节和4.2.1节)
4.2.3soapmustunderstand属性
SOAPmustUnderstand全局属性用来唆使承受者在处置动静时这个条目是不是必需处置。条目标吸收者由SOAPactor属性界说(见4.2.2节)。MustUnderstand属性的值是"1"或"0"。短少SOAPmustUnderstand属性在语义上同等于它的值为"0"。假如一个头元素的SOAPmustUnderstand属性的值是"1",那末条目标承受者必需大概恪守语义(如以元素的全名传送)并依照语义准确的处置,大概保持处置动静(见4.4节)。SOAPmustUnderstand属性思索了动静演化的正确性(robustevolution)。必需假定包括SOAPmustUnderstand属性且值为"1"的元素以某种体例修正了它们的父元素或同层元素的语义。以这类体例毗连元素确保了语义上的变更不会被那些不克不及完整了解它的吸收者疏忽。假如这个属性要失效,它必需呈现在SOAP动静实例中。(见第3节和4.2.1节)
4.3soap体
SOAP体元素供应了一个复杂的机制,使动静的终极吸收者能互换需要的信息。利用体元素的典范情形包含设置RPC哀求和毛病呈报。体元素编码为SOAP封装元素的间接子元素。假如已有一个头元素,那末体元素必需紧跟在头元素以后,不然它必需是SOAP封装元素的第一个间接子元素。体元素的一切间接子元素称作体条目,每一个体条目在SOAP体元素中编码为一个自力的元素。条目标编码划定规矩以下:
一个条目由它的元素全名(包含名域uri和部分名)断定。soap体元素的间接子元素多是名域限定的。
SOAPencodingstyle属性大概用来唆使条目(见4.1.1节)的编码体例。
SOAP界说了一个Fault条目用来呈报毛病信息。(见4.4节)
4.3.1SOAP头和体的干系
固然头和体界说为自力的元素,它们实践上是有干系的。体条目和头条目标干系以下:体条目在语义上同等于actor属性为缺省值且mustUnderstand属性值为"1"的头条目。不利用actor属性则暗示缺省的actor。(见4.2.2节)
4.4soap毛病
SOAP毛病元素用于在SOAP动静中照顾毛病和(或)形态信息。假如有SOAP毛病元素,它必需以以体条目标体例呈现,而且在一个别元素中最多呈现一次。SOAP毛病元素界说了以下四个子元素:
faultcode
faultcode元素给软件供应了一个辨认此毛病的算法机制。SOAP毛病元素必需有faultcode子元素,而且它的值必需是一个正当的名(在节界说)。SOAP界说一些SOAPfaultcode形貌基础的SOAP毛病(见4.4.1节)。
faultstring
faultstring元素供应了一个毛病注释,而不是为了软件处置。faultstring元素相似于HTTP中界说(见,第6.1节)的Reason-Phrase。SOAP毛病元素必需有faultstring子元素,而且它应当供应一些毛病实质的注释信息。
faultactor
faultactor元素供应了在动静路径上是谁招致了毛病产生的信息(见第2节)。它相似于SOAPactor属性(见4.2.2节),只是SOAPactor指的是头条目标目标地,faultactor指的是毛病的来历。faultactor属性的值是用来辨别毛病来历的URI。不是SOAP动静的终极目标地的使用程序必需在SOAPFault元素中包括faultactor元素。动静的终极目标地可使用faultactor元素明白的唆使是它发生了这个毛病(拜见上面的detail元素)
detail
detail元素用来照顾与Body元素有关的使用程序所要的毛病信息。假如Body元素的内容不克不及被乐成的处置,则必需包括detail子元素。它不克不及用来照顾属于头条目标毛病信息。头条目标具体堕落信息必需由头条目照顾。Fault元素中没有detail元素暗示这个毛病与Body元素的处置有关。在有毛病的时分,这能够用来辨别Body元素有无被准确的处置。detail元素的一切间接子元素称作detail条目,而且每一个detail条目在detail元素中编码为自力的元素。detail条目标编码划定规矩以下(拜见例10):一个detail条目由它的元素全名(包含名域URI和部分名)断定。SOAP体元素的间接子元素多是名域限定的。SOAPencodingstyle属性大概用来唆使detail条目(见4.1.1节)的编码体例。也能够有别的的Fault子元素,只需它们是名域限定的。
4.4.1SOAP毛病代码
在形貌这个标准中界说的毛病时,这一节中界说的Faultcode值必需用在faultcode元素中。这些faultcode值得名域标记符为"http://schemas.xmlsoap.org/soap/envelope/";。界说这个标准以外的办法时保举(不请求)利用这个名域。缺省的SOAPfaultcode值以可扩大的体例界说,同意界说新的SOAPfaultcode值,并与现有的faultcode值向后兼容。利用的机制相似于HTTP中界说的1xx,2xx,3xx等基础的形态类(见第10节),不外,它们界说为XML正当名(见第3节),而不是整数。字符"."(点)作为faultcode的分开符,点右边的毛病代码比右侧的毛病代码更加一般。如:
client.authentication
这篇文档中界说的faultcode值是:
称号寄义
VersionMismatch处置方发明SOAP封装元素有分歧法的名域(见4.1.2节)
MustUnderstand处置方不睬解大概不平从一个包括值为"1"的
mustUnderstand属性的SOAP头元素的间接子元素。(见4.2.3节)
client
client毛病类暗示动静的格局毛病大概不包括得当的准确信息。比方,动静大概短少准确的认证和付出信息。一样平常地,它暗示动静不克不及不作修正就重发。拜见4.4节
soapfaultdetail子元素的形貌。
server
server毛病类暗示因为动静的处置历程而不是动静的内容自己使得动静动静不克不及准确的处置。比方,处置动静时大概要与别的处置器通讯,但它没有呼应。这个动静大概在迟一点的工夫处置乐成。soapfault子元素的具体信息拜见4.4节
5.soap编码
SOAP编码格局基于一个复杂的范例体系,归纳综合了程序言语,数据库和半布局化数据等范例体系的配合特征。一个范例大概是一个复杂的(标量的)范例,大概是由几个部分组合而成的复合范例,个中每一个部分都有本人的范例。以下将具体形貌这些范例。这一节界说了范例化工具的序列化划定规矩。它分两个条理。起首,给定一个与范例体系的标记体系分歧的Schema(译者注:这里的schema不是切合XML语法的schema,而仅仅暗示狭义的用于暗示动静布局的界说体例),就机关了XML语法的Schema。然后,给定一个范例体系的Schema和与这个Schema分歧的特定的值,就机关了一个XML文档实例。反之,给定一个按照这些划定规矩发生的XML文档实例和初始的Schema,就能够机关初始值的一个正本。这一节中界说的元素和属性的名域标记符为"http://schemas.xmlsoap.org/soap/encoding/";。上面的例子都假定在上一层的元素中声了然名域。
勉励利用这一节中形貌的数据模子和编码体例,但也能够在SOAP中利用其他的数据模子和编码体例。(见4.1.1节)
5.1xml中的编码范例划定规矩
XML同意十分天真的数据编码体例。SOAP界说了一个较小的划定规矩汇合。这一节在总的条理上界说了这些编码划定规矩,下一节将形貌特定范例的编码划定规矩的细节。这一节界说的编码划定规矩能够与第7节中所述的RPC挪用和应对映照分离利用。上面的术语用来形貌编码划定规矩:
一个"value"是一个字符串,范例(数字,日期,列举等等)的名或是几个复杂值的组合。一切的值都有特定的范例。
一个"simplevalue"没着名部分,如特定的字符串,整数,列举值等等。
一个"compoundvalue"是相干的值的分离,如订单,股票报表,街道地点等等。在"compoundvalue"中,每一个相干的值都潜伏的以名,序数或这二者来辨别。这叫作"accessor"。复合值的例子有订单和股票报表等等。数组也是复合值。在复合值中,多个accessor有不异的名是同意的,比方RDF就是如许做的。
一个"array"是一个复合值,成员值依照在数组中的地位互相辨别。
一个"struct"也是一个复合值,成员值之间的独一区分是accessor名,accessor名互不不异。
一个"simpletype"是复杂值的类,如叫做"string""integer"的类,另有列举类等等。
一个"compoundtype"是复合值的类。复合范例的例子有订单类,它们有不异的accessor名(shipTo,totalCost等),但大概会有分歧的值(大概今后被设置为断定的值)。
在复合范例中,假如范例内的accessor名互不不异,可是大概与其他范例中的accessor名不异,即,accessor名加上范例名构成一个独一的标记符,这个名叫作"部分局限名"。假如名是间接或直接的基于URI的一部分,那末不论它呈现在甚么范例中,这个名自己就能够独一标记这个accessor,如许的名叫作"全局局限名"。给定了schema中相干的值的序列化信息,便可能断定某些值只与某个accessor的一个实例有关。别的情形下则没法断定。当且仅当一个accessor援用一个值,这个值才干被视为"single-reference",假如有不止一个accessor援用它,那末就将它视为"multi-reference"。注重,大概一个断定的值在一个schema中是"single-reference",而在另外一个schema中是"multi-reference"。在语句组成上,一个元素多是"independent"或"embedded"。一个自力的元素指呈现在序列化最顶层的任何元素。一切别的元素都是嵌进元素。固然用xsi:type属性可使值的布局和范例变成自形貌的,可是序列化划定规矩同意值的范例仅仅参照schema而定。如许的schema大概利用"XMLSchemaPart1:Structures"和"XMLSchemaPart2:Datatypes"中形貌的标记体系,也大概利用别的标记体系。注重,固然序列化划定规矩能够用于除数组和布局以外的复合范例,可是很多schema仅仅包括数组和布局范例。序列化划定规矩以下:
一切的值以元素内容的情势暗示。一个multi-reference值必需暗示为一个自力元素的内容,而一个single-reference值最好不要如许暗示(也能够如许暗示)。关于每一个具有值的元素,值的范例时必需用下述三种体例之一形貌:
所属元素实例有xsi:type属性
所属元素是一个有SOAP-ENC:arrayType属性(该属性多是缺省的)的元素的子元素,大概
所属元素的名具有特定的范例,范例能够由schema断定。
一个复杂值暗示为字符数据,即没有任何子元素。每一个复杂值必需具有一个范例,这个范例大概是XMLSchemasSpecification,part2有的范例,大概具有源范例(拜见5.2节)。一个复合值编码成一个元素的序列,每一个accessor用一个嵌进元素暗示,该元素的元素名和accessor的名分歧。假如accessor的名是部分于其所属的范例的,则该元素的元素名不是及格的,不然对应的元素名是及格的。(拜见5.4节)
一个multi-reference的复杂值或复合值编码成一个自力的元素,这个元素包括一个部分的无需校验的属性,属性名为"id",范例为"ID"(按照XMLSpecification)。值的每一个accessor对应一个空元素,该元素有一个部分的,无需校验的属性,属性名为"href",范例为"uri-reference"(按照XMLSchemaSpecification),"href"属性的值援用了绝对应的自力元素的URI标记符。字符串和字符数组暗示为multi-reference的复杂范例,可是特别的划定规矩使它们在一般的情形下能被更无效的暗示(拜见5.2.1节和5.2.3节)。字符串和字符数组值的accessor大概有一个名字为"id",范例为"ID"(按照XMLSpecification)的属性。假如如许,一切这个值的一切别的accessor编码成一个空元素,这个元素有一个部分的,无需校验的属性,属性名为"href",范例为"uri-reference"(按照XMLSchemaSpecification),"href"属性的值援用了包括这个值的元素的URI标记符。编码时同意一个值有多个援用,就像多个分歧的值有多个援用一样,但这仅在从高低文能够晓得这个XML文档实例的寄义没有改动时才可以使用。数组是复合值(拜见5.4.2节)。SOAP数组界说为具有范例"SOAP-ENC:Array"或从它衍生的范例.
soap数组能够时一维或多维,它们的成员以序数地位互相辨别。一个数组值暗示为反应这个数组的一系列元素,数构成员按升序呈现。对多维数组来讲,右侧的这一维变更最快。每一个成员元素定名为一个自力元素。(见划定规矩2)soap数组能够是single-reference或multi-reference值,因而能够暗示为嵌进元素或自力元素的内容。soap数组必需包括一个"soap-enc:arraytype"属性,它的值指定了包括元素的范例和数组的维数。"soap-enc:arraytype"属性的值界说以下:
arraytypevalue=atypeasize
atype=QName*(rank)
rank="["*(",")"]"
asize="["#length"]"
length=1*DIGIT
"atype"布局是被包括元素的范例名,它暗示为qname而且作为范例限定在xml元素声明的
"type"属性中呈现(这意味着被包括元素的一切值都要与该范例分歧,即在SOAP-ENC:arrayType中援用的范例必需是每一个数构成员的范例或超范例)。在arraysofarraysor"jaggedarrays"的情形下,范例组件编码为"innermost"范例且在从第一层入手下手的嵌套数组的每层中,范例名后都跟从一个rank布局。多维数组编码时从第一维起,每维之间用逗号离隔。
"asize"布局包括一个以逗号分开的列表,数值0,1或别的整数暗示数组每维的长度。整数0暗示没有指定具体的巨细,可是大概在反省数组实践成员的巨细后断定。比方,一个5个成员的整型数组的arrayTypevalue值为"int[]",它的atype值是int[]",asize值是""。一样,一个3个成员的两维整型数组的arrayTypevalue值为"int[,]",它的atype值是int[,]",asize值是""。
一个SOAP数构成员大概包括一个"SOAP-ENC:offset"属性暗示这一项在全部数组中的地位偏移值。这被用来唆使一个部分储值数组(见5.4.2.1节)的地位偏移值。一样,一个数构成员大概包括一个"SOAP-ENC:position"属性暗示这一项在全部数组中的地位,这被用来形貌希罕数组(见5.4.2.2节)的成员。"SOAP-ENC:offset"和"SOAP-ENC:position"属性值的界说以下:
arraypoint="["#length"]"
偏移值和地位从0入手下手
NULL值或缺省值大概经由过程省略accssor元从来暗示。NULL值也大概经由过程一个包括值为1的xsi:null属性的accssor元从来暗示,别的的依附于使用程序的属性和值也大概用来暗示NULL值。注重,划定规矩2同意自力的元素和数构成员名分歧于值范例的元素。
5.2复杂范例
SOAP接纳了"XMLSchemaPart2:Datatypes"标准"Built-indatatypes"节中的一切范例作为复杂范例,包含值和取值局限。比方:
范例举例
int58502
float314159265358979E+1
negativeInteger-32768
stringLouis"Satchmo"Armstrong
在xmlschema标准中声明的数据范例能够间接用在元素schema中,也能够利用从这些范例衍生的新范例。一个schema和对应的具有这些范例的元素的数据实例的例子以下所示:
<elementname="age"type="int"/>
<elementname="height"type="float"/>
<elementname="displacement"type="negativeInteger"/>
<elementname="color">
<simpleTypebase="xsd:string">
<enumerationvalue="Green"/>
<enumerationvalue="Blue"/>
</simpleType>
</element>
<age>45</age>
<height>5.9</height>
<displacement>-450</displacement>
<color>Blue</color>
一切复杂值必需编码为元素的内容,它的范例大概在"xmlschemapart2:datatypes"标准中界说过,大概是基于一个用xmlschema标准供应的机制能推衍生出的范例。假如一个复杂值编码为自力元素或异质数构成员,那末有一个对应于数据范例的元素声明将会很便利。由于"xmlschemapart2:datatypes"标准包含了范例界说,可是不包含对应的元素声明,soap-encschema和名域为每一个复杂数据范例声了然一个元素,如<soap-enc:intid="int1">45</soap-enc:int>
5.2.1字符串
字符串数据范例的界说在"XMLSchemaPart2:Datatypes"标准中。注重,这分歧于很多数据库和程序言语中的"string"范例,出格的,字符串数据范例大概克制某些在那些言语中同意的字符。(这些值必需用xsd:string以外的数据范例暗示)一个字符串大概编码为一个single-reference或multi-reference值。包括字符串值的元素大概有一个"id"属性。附加的accessor元素大概有对应的"href"属性。
比方,统一字符串的两个accessor大概以以下情势呈现:
<greetingid="string-0">hello</greeting>
<salutationhref="#String-0"/>
可是,假如两个accessor参考统一字符串实例(或字符串的子范例),这不是一个本色成绩,它们能够编码为两个single-reference值,以下所示:
<greeting>hello</greeting>
<salutation>Hello</salutation>
这个例子的schema片段以下所示:
<elementname="greeting"type="soap-enc:string"/>
<elementname="salutation"type="SOAP-ENC:string"/>
在这个例子中,soap-enc:string范例用作元素的范例,这是声明数据范例是"xsd:string"且同意"id"和"href"属性的元素的烦琐办法。准确界说拜见soap编码schema。schemas可使用这些源自soap编码schema的声明,但也能够不如许做。
5.2.2enumerations
"XMLSchemaPart2:Datatypes"标准界说了"enumeration."机制。SOAP数据模子间接接纳了这类机制。可是,因为程序言语和别的言语在界说列举时一般有些分歧,以是我们在这里具体论述了它的观点并形貌了一个列表成员的大概取的值是怎样编码的。"Enumeration"作为一个观点暗示分歧的名字的汇合。一个特定的列举就是对应于特定的基范例的分歧的值的列表。比方,色彩汇合("Green","Blue","Brown")能够界说为基于字符串范例的列举,("1","3","5")多是一个基于整型数的列举,等等。"XMLSchemaPart2:Datatypes"撑持除布尔型之外一切复杂范例的列举。"XMLSchemaPart1:Structures"标准的言语能够用来界说列举范例。假如schema由另外一个没有特定基范例合用的标记体系天生,就利用"string"。鄙人面schema的例子中,"EyeColor"界说为字符串,大概的值是"Green","Blue",或"Brown"的列举,数据实例依照schema显现以下。
<elementname="eyecolor"type="tns:eyecolor"/>
<simpleTypename="EyeColor"base="xsd:string">
<enumerationvalue="Green"/>
<enumerationvalue="Blue"/>
<enumerationvalue="Brown"/>
</simpleType>
<Person>
<Name>HenryFord</Name>
<Age>32</Age>
<EyeColor>Brown</EyeColor>
</Person>
5.2.3字符数组
一个字符数组大概编码为single-reference或multi-reference值。字符数组的编码划定规矩与字符串的编码划定规矩相似。出格的,包括字符数组的元素值大概由一个"id"属性,附加的accssor元素大概有响应的"href"属性。保举利用界说在XMLSchemas中的base64编码(利用在2045中界说的base64编码算法)暗示含混字符数组。不外,因为行长度(linelength)的限定,一般在MIME中使用base64编码,SOAP中一样平常不该用base64编码。可是供应了"SOAP-ENC:base64"子范例使之能用于SOAP。
<picturexsi:type="soap-enc:base64">
aG93IG5vDyBicm73biBjb3cNCg==
</picture>
5.3多态accessor
很多言语同意可以多态会见多品种型值的accessor,每品种型在运转时可用。一个多态accessor实例必需包括一个"xsi:type"属性形貌实践值的范例。比方,一个名为"cost"范例值为"xsd:float"的多态accessor编码以下:
<costxsi:type="xsd:float">29.95</cost>与之对照,范例值稳定的accessor编码以下:
<cost>29.95</cost>
5.4compoundtypes复合范例
SOAP界说了与以下常在程序言语中呈现的布局性形式对应的范例:
布局:一个"struct"是一个复合值,它的成员值的独一区分是accessor称号,恣意两个accessor称号都不不异。
数组:一个"array"是一个复合值,它的成员值的独一区分是序数地位。
SOAP也同意布局和数组以外的别的数据的序列化,比方Directed-Labeled-GraphDataModel之类的数据中,单个节点有很多分歧的accssor,有些不止呈现一次。SOAP序列化划定规矩不请求底层的数据模子在accssor之间辨别序次,但假如有如许的序次的话,这些accssor必需依照这个按次编码。
5.4.1复合值,布局和值援用
复合值的成员编码为accessor元素。当accessor由名辨别时(如布局),accessor名即作为元素名。名部分于范例的accessor有不受限的名,别的的accessor则有受限的名。上面的例子是范例为"Book"的布局:
<e:book>
<author>HenryFord</author>
<preface>Prefatorytext</preface>
<intro>Thisisabook.</intro>
</e:Book>
以下是形貌下面布局的schema片段:
<elementname="book">
<complexType>
<elementname="author"type="xsd:string"/>
<elementname="preface"type="xsd:string"/>
<elementname="intro"type="xsd:string"/>
</complexType>
</e:Book>
以下是一个同时具有复杂和庞大成员范例的例子。它显现两层援用。注重"author"accssor元素的"href"属性是对响应具有"id"属性的值的援用。"address"与之相似。
<e:book>
<title>MyLifeandWork</title>
<authorhref="#Person-1"/>
</e:Book>
<e:Personid="Person-1">
<name>HenryFord</name>
<addresshref="#Address-2"/>
</e:Person>
<e:Addressid="Address-2">
<email>mailto:henryford@hotmail.com</email>
<web>http://www.henryford.com<;;/web>
</e:Address>
当"person"的值和"address"的值是multi-reference时,下面的情势是准确的。假如它
们是single-reference,就必需用嵌进的情势,以下所示:
<e:book>
<title>MyLifeandWork</title>
<author>
<name>HenryFord</name>
<address>
<email>mailto:henryford@hotmail.com</email>
<web>http://www.henryford.com<;;/web>
</address>
</author>
</e:Book>
假如增加一个限定,恣意两团体都不会有不异的地点,而且地点能够是街道或email地点,一本书能够有两个作者,编码以下:
<e:book>
<title>MyLifeandWork</title>
<firstauthorhref="#Person-1"/>
<secondauthorhref="#Person-2"/>
</e:Book>
<e:Personid="Person-1">
<name>HenryFord</name>
<addressxsi:type="m:Electronic-address">
<email>mailto:henryford@hotmail.com</email>
<web>http://www.henryford.com<;;/web>
</address>
</e:Person>
<e:Personid="Person-2">
<name>SamuelCrowther</name>
<addressxsi:type="n:Street-address">
<street>MartinLutherKingRd</street>
<city>Raleigh</city>
<state>NorthCarolina</state>
</address>
</e:Person>
序列化能够包括对不在统一个资本的值的援用:
<e:book>
<title>ParadiseLost</title>
<firstauthorhref="http://www.dartmouth.edu/~milton/";/>
</e:Book>
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听) 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗? 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。
页:
[1]