国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Web 服務(wù)互操作性和 SOAP

2024-07-21 02:21:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
摘要:本文概要說(shuō)明了在通過(guò) soap 進(jìn)行 rpc 調(diào)用時(shí)當(dāng)前實(shí)際存在的互操作性問(wèn)題,同時(shí)討論了導(dǎo)致互操作性問(wèn)題的三個(gè)
因素:http 問(wèn)題、xml 問(wèn)題和 soap 間斷性。

目錄

簡(jiǎn)介
什么是 soap?
常見(jiàn)的互操作性問(wèn)題
傳輸問(wèn)題
xml 問(wèn)題
soap 問(wèn)題
后續(xù)話題

簡(jiǎn)介
當(dāng)前有多種創(chuàng)建應(yīng)用程序的平臺(tái)。但每種平臺(tái)都習(xí)慣于使用自身的協(xié)議(本質(zhì)上通常是二進(jìn)制代碼)來(lái)實(shí)現(xiàn)機(jī)器間的集
成。因此,跨平臺(tái)的應(yīng)用程序在數(shù)據(jù)共享方面的能力相當(dāng)有限。認(rèn)識(shí)到這些限制后,人們一直在致力于建立有關(guān)數(shù)據(jù)格式
和數(shù)據(jù)交換方面的標(biāo)準(zhǔn),藉此以實(shí)現(xiàn)“不論服務(wù)采用何種軟件,使用何種硬件,都能夠跨越這一傳統(tǒng)的界限以 web 的形式
無(wú)縫地將它們集成在一起”這一遠(yuǎn)景目標(biāo)。目前,這一目標(biāo)已迅速發(fā)展成為一種新的計(jì)算范例。

該目標(biāo)的核心是互操作性概念,即不同系統(tǒng)能夠無(wú)縫地進(jìn)行通信和共享數(shù)據(jù)。這也是 web 服務(wù)追求的目標(biāo)。web 服務(wù)是一
種可以用標(biāo)準(zhǔn) internet 協(xié)議來(lái)訪問(wèn)的可編程應(yīng)用邏輯;從另一個(gè)角度來(lái)說(shuō),web 服務(wù)是有關(guān)機(jī)器間和應(yīng)用程序間透明通
信的、借助于 web 的標(biāo)準(zhǔn)的具體實(shí)現(xiàn)。

目前,實(shí)現(xiàn)機(jī)器間消息傳遞的 web 服務(wù)技術(shù)多種多樣,例如簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (simple object access protocol,
soap)、web 服務(wù)說(shuō)明語(yǔ)言 (web service description language, wsdl) 和超文本傳輸協(xié)議 (hypertext transfer
protocol, http)。這些消息的復(fù)雜程度各不相同,既有簡(jiǎn)單的方法調(diào)用,也有復(fù)雜的訂單提交。在 web 服務(wù)的功能中,
最一般但又較高級(jí)的功能是實(shí)現(xiàn) rpc(遠(yuǎn)程過(guò)程調(diào)用)形式的通信(通過(guò) rpc,一臺(tái)計(jì)算機(jī)上的程序可以執(zhí)行另一臺(tái)計(jì)算
機(jī)的程序。)本文從實(shí)用的角度介紹了在使用 soap 進(jìn)行 rpc 形式的通信時(shí)當(dāng)前常見(jiàn)的互操作性問(wèn)題,以后還將撰文探討
有關(guān)通過(guò) soap、wsdl 以及其它協(xié)議傳送消息的問(wèn)題。


圖 1:web 服務(wù)路線圖:有線協(xié)議元素、服務(wù)說(shuō)明和發(fā)現(xiàn)

什么是 soap?
soap 是 simple object access protocol(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)的縮寫。該協(xié)議的當(dāng)前版本為 1.1,其具體規(guī)范發(fā)布在下
列站點(diǎn)上: www.w3.org/tr/soap(英文)。soap 以 xml 為基礎(chǔ),說(shuō)明了機(jī)器間通信的消息傳送格式。此外,它還包括幾
個(gè)可選部分,用于描述方法調(diào)用 (rpc) 和詳細(xì)說(shuō)明通過(guò) http 發(fā)送 soap 消息的方法。(有關(guān) soap 和 web 服務(wù)的詳細(xì)
背景知識(shí),請(qǐng)參見(jiàn) web 服務(wù)的平臺(tái)(英文)。)

以下是一個(gè)典型的 soap 請(qǐng)求(包括 http 標(biāo)頭),它請(qǐng)求名為 echostring 的 rpc 方法調(diào)用,并將一個(gè)字符串當(dāng)作參
數(shù):

post /test/simple.asmx http/1.1
host: 131.107.72.13
content-type: text/xml; charset=utf-8
content-length: length
soapaction: "http://soapinterop.org/echostring"

<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body soap:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echostring>
<inputstring>string</inputstring>
</tns:echostring>
</soap:body>
</soap:envelope>

如上所示,該請(qǐng)求將方法名編碼為 xml : <tns:echostring>,將字符串參數(shù)編碼為 <inputstring>。它所代表的 c# 方法
類似于以下內(nèi)容:

public string echostring(string inputstring);

以下是來(lái)自服務(wù)器的響應(yīng):

http/1.1 200 ok
content-type: text/xml; charset=utf-8
content-length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body soap:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echostringresponse>
<return>string</return>
</tns:echostringresponse>
</soap:body>
</soap:envelope>

有關(guān)序列化字符串?dāng)?shù)據(jù)類型以及方法調(diào)用形狀的規(guī)則在 soap 1.1 的第 5 節(jié)和第 7 節(jié) (www.w3.org/tr/soap(英文))
中定義。

常見(jiàn)的互操作性問(wèn)題
當(dāng)執(zhí)行 rpc 形式的 soap 消息傳送時(shí),可能會(huì)因?yàn)槎喾N原因?qū)е禄ゲ僮餍詥?wèn)題。有趣的是,許多互操作性問(wèn)題都不是
soap 本身的問(wèn)題,而是基本傳輸引擎或 xml 引擎所導(dǎo)致的互操作性問(wèn)題。也就是說(shuō),互操作性問(wèn)題可能是:

http 問(wèn)題


xml 問(wèn)題,或


soap 間斷性
還應(yīng)指出的是,這些規(guī)范的制定者也有考慮不周的地方,他們有時(shí)可能會(huì)模棱兩可,這樣就很難確定唯一正確的行為。

傳輸問(wèn)題
xml web 服務(wù)消息的核心在于發(fā)送消息的傳輸機(jī)制。當(dāng)通過(guò) soap 進(jìn)行 rpc 調(diào)用時(shí),http 是目前最為常用的傳輸機(jī)制。
這意味著 soap 堆棧之間必然存在 http 互操作性問(wèn)題。

http 互操作性問(wèn)題的一個(gè)簡(jiǎn)單示例就是 soapaction 的使用。soapaction 是一種 http 標(biāo)頭,它必須存在于通過(guò) http
傳送的 soap 消息中。此標(biāo)頭可以賦以多個(gè)不同的值,例如:

soapaction: "http://tempuri.org/"

soapaction 的值雖然可以完全為空,但必須用引號(hào)引起來(lái):

soapaction:

問(wèn)題就在這兒:如果服務(wù)器要求空值 soapaction,有些客戶端將無(wú)法滿足這一要求,因?yàn)椴⒎撬?http 客戶端 api 都
具有設(shè)置空 http 標(biāo)頭值的方法。這種問(wèn)題可能存在兩種解決方法:修正客戶端 api 和/或確保服務(wù)器不要求空值
soapaction。通常,避免這類問(wèn)題的唯一方法是確保所使用的 http api 穩(wěn)定強(qiáng)壯,并且已知可以在 web 上工作。即便如
此,這類問(wèn)題仍可能出現(xiàn);要徹底消除它們,測(cè)試可能是唯一的方法。

xml 問(wèn)題
這是可能存在的第二類互操作性問(wèn)題,它們涉及到 xml 語(yǔ)法分析和 xsd 架構(gòu)處理。soap 使用 xml 和 xml 架構(gòu)作為核
心,因此這兩者的互操作性是 soap 互操作性的基礎(chǔ)。

有一個(gè)有趣的互操作性問(wèn)題示例,它同時(shí)涉及到 xml 語(yǔ)法分析和 http 傳輸,并且與字節(jié)順序標(biāo)記 (byte order mark,
bom) 相關(guān)。當(dāng)通過(guò) http 發(fā)送數(shù)據(jù)時(shí),您可以在 content-type 標(biāo)頭中指定數(shù)據(jù)的編碼形式,如 utf-16 或 utf-8。也可
以通過(guò)插入一組用來(lái)指定編碼形式的字節(jié)來(lái)表示某一段 xml 的編碼形式。當(dāng)發(fā)送 utf-16 時(shí),即使 content-type 標(biāo)頭中
指定了編碼形式,也仍需要 bom 來(lái)指示是 big-endian 還是 little-endian;但對(duì)于 utf-8,bom 則是不必要的。例如:

http/1.1 200 ok
content-type: text/xml; charset=utf-8
content-length: length

n++<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body soap:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echostringresponse>
<return>string</return>
</tns:echostringresponse>
</soap:body>
</soap:envelope>

示例中的前三個(gè)字符是字節(jié)順序標(biāo)記的十六進(jìn)制代碼,用于指示編碼形式為 utf-8,不過(guò),您可以看到,content-type 也
指出了這點(diǎn)。即使不需要,但是有些實(shí)現(xiàn)方案仍會(huì)為 utf-8 發(fā)送 bom。而其它實(shí)現(xiàn)方案有了 bom 反而無(wú)法處理 xml。為
了解決這一問(wèn)題,應(yīng)避免在不需要的時(shí)候發(fā)送 bom,并且應(yīng)正確處理 bom。由于在處理 utf-16 消息時(shí)需要 bom,所以在
這種情況下務(wù)必要正確處理 bom。雖然沒(méi)有任何單一的方法可以提早解決這些問(wèn)題,不過(guò)當(dāng)發(fā)現(xiàn)問(wèn)題時(shí),最好的方法就是
參考描述標(biāo)準(zhǔn)的具體規(guī)范(通常在 w3c 上可以找到),然后應(yīng)用這些規(guī)范來(lái)評(píng)判遇到的問(wèn)題。

soap 問(wèn)題
現(xiàn)在,我們將討論問(wèn)題的核心:soap 問(wèn)題本身。如上所述,soap 的互操作性首先要求解決傳輸(通常是 http)和 xml
問(wèn)題。解決這兩個(gè)問(wèn)題之后,再來(lái)解決 soap 問(wèn)題。

soap 本身的問(wèn)題相對(duì)簡(jiǎn)單。它要求將消息裝入信封,并將消息的實(shí)際內(nèi)容放在正文元素中。soap 使標(biāo)頭等元素成為可選
項(xiàng),對(duì)正文元素中可包含的內(nèi)容允許存在一定的靈活性。以下是一個(gè)簡(jiǎn)單的 soap 消息示例,大多數(shù)堆棧與它進(jìn)行互操作
時(shí)不會(huì)存在問(wèn)題:

<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body >
<foo />
</soap:body>
</soap:envelope>

雖然這個(gè)示例不是十分有趣,但是 soap 還提供一種對(duì)常見(jiàn)數(shù)據(jù)類型進(jìn)行編碼的方法(請(qǐng)參見(jiàn) soap 規(guī)范的第 5 節(jié)),它
進(jìn)一步說(shuō)明了如何對(duì) rpc 方法調(diào)用進(jìn)行編碼。您可能已注意到,在前面的示例中,方法名是正文的子標(biāo)記,參數(shù)則是方法
名的子標(biāo)記。

即使不用這么麻煩,您也可以找到許多有趣的互操作性問(wèn)題。例如,soap 規(guī)范規(guī)定,如果您收到 mustunderstand 屬性設(shè)
置為“1”的 soap 標(biāo)頭,就必須理解它,否則將出錯(cuò)。但許多實(shí)現(xiàn)方案并沒(méi)有做到這點(diǎn)。以下是 mustunderstand 標(biāo)頭的
示例:

http/1.1 200 ok
content-type: text/xml; charset=utf-8
content-length: length

n++<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:header>
<foo soap-env:mustunderstand="1">
hello!
</foo>
</soap-env:header>
<soap:body soap:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echostringresponse>
<return>string</return>
</tns:echostringresponse>
</soap:body>
</soap:envelope>

這個(gè)示例是通過(guò) soap 互操作性測(cè)試發(fā)現(xiàn)的眾多問(wèn)題之一。有關(guān)現(xiàn)已發(fā)現(xiàn)的互操作性問(wèn)題的更多示例,請(qǐng)參見(jiàn)
http://groups.yahoo.com/group/soapbuilders(英文)中的檔案。總之,為了確保 soap 在實(shí)現(xiàn) rpc 形式通信時(shí)的互操
作性,全世界的 soap 構(gòu)建者已經(jīng)做了很多工作,并取得了豐碩的成果。從 5 月 8 日到 5 月 10 日,在拉斯維加斯將舉
行 networld+interop 會(huì)議,到時(shí),soap 團(tuán)體的許多成員將在會(huì)上將充分展示這方面的成果。如果您在使用 soap 堆棧或
對(duì)其感興趣,歡迎惠顧這次演示會(huì)。

另外,有關(guān) xml web 服務(wù)的許多討論和測(cè)試已經(jīng)在 http://groups.yahoo.com/group/soapbuilders(英文)、
http://www.mssoapinterop.org/(英文)和 http://www.xmethods.net/ilab/(英文)等站點(diǎn)上進(jìn)行。這些站點(diǎn)包含到許
多互操作性測(cè)試端點(diǎn)的鏈接。構(gòu)建 soap 堆棧的所有人員都應(yīng)該閱讀這些檔案并參與互操作性測(cè)試。

后續(xù)話題
本文簡(jiǎn)要概括了在 xml web 服務(wù)領(lǐng)域中發(fā)現(xiàn)的一些早期互操作性問(wèn)題。不過(guò),這方面的討論并不會(huì)就此停止。除了通過(guò)
http 進(jìn)行 rpc 調(diào)用之外,soap 還有許多更為有趣的情況需要討論。其中包括“document”形式的消息傳遞、基于 smtp
和其它傳輸機(jī)制的 soap、wsdl 以及各種 soap 標(biāo)頭測(cè)試 - 所有這些都值得在今后的文章中進(jìn)行討論。

最大的網(wǎng)站源碼資源下載站,

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武冈市| 富阳市| 扎兰屯市| 绿春县| 莱西市| 怀来县| 永昌县| 泗阳县| 丁青县| 鄂托克前旗| 青海省| 江川县| 葫芦岛市| 连云港市| 阿图什市| 江油市| 宜宾市| 凤山县| 乳源| 榆林市| 涪陵区| 临泉县| 东台市| 石河子市| 宜宾市| 临夏县| 上高县| 旅游| 依安县| 临桂县| 白沙| 刚察县| 河西区| 商河县| 卢湾区| 永兴县| 朝阳县| 清涧县| 图片| 垦利县| 长沙市|