《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > SOAP消息處理器的設計與實現
SOAP消息處理器的設計與實現
賀學林
摘要: 介紹了基于XML的SOAP技術的特點和優勢,描述了SOAP應用系統的架構,并揭示了其消息處理過程的機理和技術細節,結合具體的SOAP處理器的實現模型設計和實現了SOAP處理器。
Abstract:
Key words :

  摘  要: 介紹了基于XML的SOAP技術的特點和優勢,描述了SOAP應用系統的架構,并揭示了其消息處理過程的機理和技術細節,結合具體的SOAP處理器的實現模型設計和實現了SOAP處理器。

  關鍵詞: 分布式應用  信息交換  RPC  XML  SOAP協議  WSDL  SOAP處理器

 

  XML和簡單對象訪問協議(Simple Object Access Protocol,SOAP)帶來了信息交換技術革命性的進步,極大地促進了分布式應用的發展。目前,在基于SOAP信息交換應用的集成化開發環境和工具中關于SOAP的技術對開發人員基本上是透明的,即屏蔽和隱藏了SOAP實現和處理的細節。這樣做可以方便開發工作,但卻不利于開發者真正透徹地掌握SOAP的關鍵技術。深入了解SOAP消息的處理過程和SOAP處理器的工作機理,可以對分布式應用進行更加靈活地控制,甚至可以自行開發SOAP消息處理器以適應各種特殊的處理需求。

1  SOAP概述

  SOAP是一種應用程序之間進行數據通信的機制。可擴展標記語言XML作為數據表達通用的中性語言,使分布式應用的各計算節點在數據的“表示層”得到了統一,也使得基于XML的SOAP成為用于數據交換的、方便的封裝協議。廣義上的SOAP是網絡表示層的協議,是標準的信息交換工具,可以用來實現消息系統,但其目前最主要的應用是進行遠程過程調用(RPC)。應用SOAP技術,可以構建基于消息通信的、松散耦合的、跨平臺的分布式處理系統,這極大地適應了互聯網環境的應用需求。

2  SOAP消息處理模型

2.1 SOAP的應用架構和消息處理模型框架

  SOAP成功地解決了異構網絡環境中的軟件組件和應用程序之間進行可靠信息交換的難題。以Web Service為例,其SOAP RPC的應用架構如圖1所示。一般開發環境都隱藏了SOAP消息處理的過程,這部分功能封裝于由開發環境自動生成的客戶端和服務器端的SOAP代理模塊中,其中都使用了編譯好的高層類庫,用戶據此難以探究其內部的處理細節。

 

  實際上,客戶端和服務器端的SOAP代理模塊內部做了大量的處理工作。SOAP RPC的處理過程如圖2所示。客戶端模塊按照Web Service使用接口(一般用WSDL文檔進行描述)要求的格式和規范,通過XML處理器將客戶端的RPC調用編碼成SOAP請求消息(SOAP消息的串行化)。SOAP請求消息中按規定封裝了請求服務所必需的信息,借助傳輸協議(如HTTP)傳送到服務器端;服務器的傳輸協議監聽器得到傳輸的內容,由服務器端的代理模塊按照WSDL文檔描述的Web Service接口的信息采用XML處理器對SOAP請求消息進行解析,提取出適當的信息,生成提供相應的Web服務的對象,調用請求的方法,得到服務程序的處理結果,再按WSDL文檔的要求將服務處理結果生成(串行化)SOAP響應消息,借助傳輸協議傳回客戶端;客戶端的代理按照WSDL文檔描述的信息解析(反串行化)SOAP響應消息,提取出適當的信息返回客戶程序。在客戶端和服務器端對SOAP消息進行串行化和反串行化期間,涉及到客戶程序的數據類型與XML的類型系統XSD(或SOAP規范的類型系統)之間,以及XML的類型系統XSD與服務程序的數據類型之間的相互映射,還有對象參數的序列化和反序列化工作。

 

 

  當SOAP與HTTP綁定時,服務器端的消息監聽可以采用ASP或ISAPI處理方式。

  SOAP消息的生成和解析工作與WSDL文檔密切相關,只有遵照Web Service對應的WSDL文檔中描述的信息格式,SOAP消息才能得到正確的、自動化的處理。

2.2 WSDL簡介

  WSDL(Web Service Description Language)是一種接口定義語言(IDL)。它以一種XML模式來描述Web Service的接口。服務的使用方根據這些描述信息來理解如何使用服務。由于描述方法和格式具有統一的標準和規范,因此便于由機器來自動處理描述信息。實際上,很多開發環境就是由軟件工具根據服務模塊自動生成相應的WSDL文檔。WSDL文檔使用這些元素來定義Web Service的使用接口:Types、Message、Operation、Port Type、Binding、Port、Service。

  在具體實現SOAP處理器的過程中需要編程訪問WSDL文檔。為使篇幅簡潔,本文將采用MS SOAP TK 3.0中提供的WSDL文檔模型對象接口(詳情可參見MSTK3.0開發文檔)來編程分析WSDL文檔,即通過編程對象及其方法遍歷文檔中的元素,得到的接口描述信息用以處理SOAP消息。

3 實現SOAP處理器的功能

  由圖2所示的SOAP消息處理器的功能和過程架構,可以實現自行開發的SOAP處理器。

3.1 具體的實現模型

  由于SOAP消息和WSDL文檔都是基于XML格式的,所以代理(處理器)的工作主要是分析和處理XML文檔。可以根據SOAP消息封裝格式、編碼規則、RPC表示以及WSDL文檔結構的協議規范,采用任一種XML解析器工具來處理SOAP和WSDL這類特殊的XML文檔(如圖2所示)。本文將采用MSTK3.0中的低層API(封裝了XML處理功能)來實現SOAP代理,處理過程反映了技術機理和細節。將準備實現的客戶端和服務器端的SOAP代理類命名為mySoapClient和mySoapServer。其內部實現過程模型分別如圖3和圖4所示。

 

 

3.2 具體實現

  下面采用VB6.0來實現mySoapClient類和mySoapServer類。

3.2.1 客戶端SOAP代理

  新建ActiveX DLL工程MyClientSoap,添加并引用Microsoft Soap Type Library v3.0。將以下代碼加入mySoapClient類模塊中。

Dim Port As IWSDLPort

Public Sub Initialize(ByVal WSDLFileName As String,

    Optional ByVal ServiceName As String=″″,

     Optional ByVal PortName As String=″″,

    Optional ByVal WSMLFileName As String=″″)

  Dim Fetched As Long

  Dim WSDLReader As New WSDLReader30

  ′load WSDL file

  WSDLReader.Load WSDLFileName,WSMLFileName

  ′get the service

  Dim ServiceEnumerator As IEnumWSDLService,Service As IWSDLService

  WSDLReader.GetSoapServices ServiceEnumerator

  If ServiceName=″″Then

              ServiceEnumerator.Next 1,Service,Fetched

  Else

              ServiceEnumerator.Find ServiceName,Service

  End If

  ′get the port

  Dim PortEnumerator As IEnumWSDLPorts

  Service.GetSoapPorts PortEnumerator

  If PortName=″″Then

              PortEnumerator.Next 1,Port,Fetched

  Else

              PortEnumerator.Find PortName,Port

  End If

End Sub

Public Function Invoke(ByVal OperationName As String,

       ParamArray Parameter() As Variant) As Variant

  ′find the operation

  Dim OperationEnumerator As IEnumWSDLOperations,

  Operation As IWSDLOperation

  Port.GetSoapOperations OperationEnumerator

  OperationEnumerator.Find OperationName,Operation

  ′prepare request

  Dim MapperEnumerator As IEnumSoapMappers,

  Mapper As ISoapMapper

  Operation.GetOperationParts MapperEnumerator

  Dim Fetched As Long

  MapperEnumerator.Next 1,Mapper,Fetched

  Do While Fetched=1

              If (Mapper.IsInput=smInput) Or (Mapper.IsInput=smInOut) Then

                  Mapper.ComValue=Parameter(Mapper.ParameterOrder)

              End If

              MapperEnumerator.Next 1,Mapper,Fetched

  Loop

  ′construct the request message and send it.

  ′(that is,invoking the operation and getting result)

  Dim Serializer As SoapSerializer30

  Dim Connector As SoapConnector30

  Set Connector=New HttpConnector30

  Connector.ConnectWSDL Port

  Connector.BeginMessageWSDL Operation

  Set Serializer=New SoapSerializer30

  Serializer.Init Connector.InputStream

  Serializer.StartEnvelope

  Serializer.StartBody

  Operation.Save Serializer,True′writes the XML

  Serializer.EndBody

  Serializer.EndEnvelope

  ′load response

  Dim SoapReader As New SoapReader30

  SoapReader.Load Connector.OutputStream

  Operation.Load SoapReader,False

  ′return the outgoing parameters and result

  MapperEnumerator.Reset

  MapperEnumerator.Next 1,Mapper,Fetched

  Do While Fetched=1

              If Mapper.IsInput=smOutput Then

                     If Mapper.VariantType=vbObject Then

                         Set Invoke=Mapper.ComValue

                     Else

                        Invoke=Mapper.ComValue

                     End If

              ElseIf Mapper.IsInput=smInOut Then

                        Parameter(Mapper.ParameterOrder)=Mapper.ComValue

              End If

              MapperEnumerator.Next 1,Mapper,Fetched

       Loop

End Function

  將以上代理編譯即可生成MyClientSoap.dll。將mySoapClient類實例化就成為客戶端SOAP代理對象。mySoapClient類向外提供了二個可調用的接口:(1)Initialize方法利用WSDL文檔中描述的Web Service接口消息來初始化客戶端代理對象,用戶還可指定要遠程調用的Web Service的服務名稱ServiceName和端口名稱PortName。(2)Invoke方法向客戶程序提供了使用Web Service的接口,用戶只需提供Web Service中的方法名稱和此方法的參數,就可以調用Web Service。

3.2.2 服務器端SOAP代理

  新建ActiveX DLL工程MyServerSoap,并添加引用Microsoft Soap Type Library v3.0。

將以下代碼加入mySoapServer類模塊中。

Dim WSDLReader As WSDLReader30

Public Sub Initialize(ByVal WSDLFileName As String,ByVal WSMLFileName As String)

  Set WSDLReader=New WSDLReader30

  WSDLReader.SetProperty ″LoadOnServer″,True

    WSDLReader.Load WSDLFileName,WSMLFileName

End Sub

Public Sub ProcessRequest(ByVal Request As IStream,ByVal Response As IStream)

  Dim WSDLPort As IWSDLPort

  Dim WSDLOperation As IWSDLOperation

  Dim Serializer As New SoapSerializer30

  Dim SoapReader As New SoapReader30

  SoapReader.Load Request

  WSDLReader.ParseRequest SoapReader,WSDLPort,

  WSDLOperation

  WSDLOperation.Load SoapReader,True

  Serializer.Init Response

  Serializer.StartEnvelope

  WSDLOperation.ExecuteOperation SoapReader,Serializer

  Serializer.StartBody

  WSDLOperation.Save Serializer,False

  Serializer.EndBody

  Serializer.EndEnvelope

End Sub

  編譯后生成MyServerSoap.dll。將mySoapServer類實例化就成為服務器端SOAP代理對象。Initialize方法利用WSDL文檔來初始化服務器端代理對象。ProcessRequest方法分析接收到的SOAP請求消息,調用相應的Web Service方法,將結果編碼成SOAP響應消息回傳。

  以上詳細剖析了SOAP消息的處理過程,設計實現了SOAP處理器。實際上,本文中實現代理類的代碼還可進一步細化,甚至完全可以不引用MSTK3.0中的低層API類庫,而采用XML解析器來編寫SOAP處理器。由于篇幅所限,還有一些細節問題未能進一步展開探討,如復雜數據類型的編碼、SOAP頭部的處理、錯誤的捕獲和附件的處理等。本文已實現了SOAP處理器最重要的核心功能框架(消息的構建、傳輸和解析等),用戶可以在此基礎上,增加調用附加功能的接口,這樣可以實現功能更加豐富的SOAP處理器。

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美日韩一区在线观看| 一本色道久久综合亚洲精品小说| 亚洲精品免费在线播放| 黑人中文字幕一区二区三区| 国产精品一卡| 国产精品自在在线| 国产精品亚洲综合一区在线观看| 国产精品久久久久久超碰| 国产精品扒开腿做爽爽爽软件| 欧美日韩二区三区| 欧美日韩在线三区| 欧美视频福利| 国产精品久久久久久久久搜平片| 国产精品久久77777| 国产精品v欧美精品v日本精品动漫 | 欧美一级网站| 久久激情五月丁香伊人| 久久嫩草精品久久久精品| 久久一区精品| 欧美精品在线免费观看| 欧美日韩岛国| 国产精品久久久久久久久久久久久| 国产精品高精视频免费| 国产欧美在线观看| 精品99一区二区三区| 亚洲国产欧美久久| 亚洲欧洲综合另类| 一区二区三区www| 亚洲欧美日韩一区二区在线 | 欧美午夜电影网| 国产精品日本| 国产一区二区三区高清播放| 狠狠操狠狠色综合网| 亚洲国产成人精品久久久国产成人一区 | 亚洲女同精品视频| 久久成人免费日本黄色| 久久夜色精品国产欧美乱极品| 欧美成人精品在线视频| 欧美三区在线视频| 国产拍揄自揄精品视频麻豆| 伊人久久婷婷色综合98网| 亚洲精品乱码久久久久| 亚洲一区二区av电影| 久久成人精品无人区| 日韩视频在线观看国产| 欧美一激情一区二区三区| 麻豆精品一区二区综合av| 欧美日韩亚洲91| 国产亚洲一级高清| 亚洲精品一区久久久久久| 亚洲欧美999| 亚洲精品一级| 欧美主播一区二区三区美女 久久精品人| 久久综合给合久久狠狠色 | 亚洲国产天堂网精品网站| 一本一本久久| 亚洲高清视频一区| 亚洲一区二区三区激情| 久久久精品国产免大香伊 | 亚洲精品美女91| 欧美一级日韩一级| 99精品视频免费在线观看| 久久精品国产99精品国产亚洲性色| 欧美精品久久久久久久久老牛影院| 国产精品免费一区二区三区在线观看| 一区二区三区在线免费播放| 一区二区欧美精品| 亚洲黄色免费电影| 先锋影音久久久| 欧美精品一区二区三区在线播放 | 亚洲小说欧美另类社区| 亚洲激情在线播放| 小处雏高清一区二区三区| 欧美国产成人在线| 国产视频欧美| 一本色道久久88亚洲综合88| 久久精品99| 欧美一区二区三区在线视频| 欧美日韩亚洲另类| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美国产va在线影院| 一本一道久久综合狠狠老精东影业 | 国产精品久久久久久亚洲调教| 亚洲第一黄网| 欧美在线观看视频在线| 亚洲欧美另类在线观看| 欧美日韩高清免费| 亚洲国产成人91精品| 欧美专区第一页| 亚洲欧美日韩国产综合| 欧美日韩亚洲系列| 亚洲精品国产精品国产自| 亚洲国产精品va在线观看黑人| 欧美亚洲日本国产| 国产精品二区影院| 一本大道av伊人久久综合| 亚洲免费精品| 欧美国产日韩在线观看| 亚洲第一精品久久忘忧草社区| 欧美在线观看视频在线| 久久国产精品网站| 国产日韩精品在线观看| 亚洲在线视频一区| 亚洲免费视频网站| 国产精品jizz在线观看美国| 亚洲精品国产欧美| av不卡在线看| 欧美日韩高清在线一区| 亚洲精品国精品久久99热| 亚洲精品社区| 欧美激情在线狂野欧美精品| 亚洲国产免费看| 亚洲人成网站影音先锋播放| 久久综合一区| 亚洲国产精品第一区二区| 亚洲精品国产精品乱码不99按摩| 另类尿喷潮videofree| 在线播放国产一区中文字幕剧情欧美| 久久精品视频免费| 蜜臀av在线播放一区二区三区| 在线观看日韩一区| 亚洲经典视频在线观看| 欧美顶级少妇做爰| 亚洲美女啪啪| 亚洲天堂成人在线视频| 国产精品久久| 欧美一区二区精品在线| 久久久久久久网| 伊人色综合久久天天| 最新国产乱人伦偷精品免费网站| 欧美夫妇交换俱乐部在线观看| 亚洲国产影院| 一区二区三区日韩在线观看| 国产精品h在线观看| 亚洲欧美伊人| 久久综合九色| 亚洲精品日日夜夜| 亚洲主播在线观看| 国产日韩欧美在线播放不卡| 久久动漫亚洲| 欧美大片在线影院| 一本久道综合久久精品| 午夜在线观看免费一区| 精品动漫3d一区二区三区免费| 亚洲三级电影全部在线观看高清| 欧美喷水视频| 亚洲一区二区黄色| 久久久午夜精品| 亚洲福利视频网| 亚洲一区二区三区精品视频| 国产伦理精品不卡| 亚洲国产岛国毛片在线| 欧美日本国产在线| 亚洲一区在线看| 久久亚洲综合色一区二区三区| 亚洲精品视频在线观看免费| 午夜精品久久久久久久99热浪潮| 国产性色一区二区| 亚洲毛片在线观看| 国产乱码精品一区二区三区五月婷 | 一区二区三区四区精品| 久久精品欧美日韩| 亚洲国产日韩欧美一区二区三区| 亚洲少妇自拍| 国产一区二区久久精品| 日韩一区二区精品视频| 国产麻豆精品在线观看| 亚洲美女电影在线| 国产伦理精品不卡| 亚洲免费观看在线观看| 国产麻豆视频精品| 亚洲精品在线电影| 国产欧美va欧美va香蕉在| 亚洲精品一区二区三区樱花| 国产精品亚洲精品| 亚洲精品视频在线播放| 国产美女高潮久久白浆| 亚洲久久一区| 国产又爽又黄的激情精品视频| 日韩图片一区| 狠狠爱综合网| 午夜欧美不卡精品aaaaa| 亚洲激情国产精品| 久久成人免费| 日韩一二三在线视频播| 美女脱光内衣内裤视频久久网站| 亚洲午夜视频| 欧美精品免费视频| 久久精品亚洲| 国产精品资源| 在线一区观看| 在线日韩av片| 久久精品一区二区三区不卡| 一区二区三区免费网站| 欧美精品一区二区精品网| 久久国产精品99国产精| 国产精品永久免费视频| 亚洲天堂久久| 亚洲精品美女| 欧美岛国在线观看|