日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

一種消息處理器的的設(shè)計(jì)與實(shí)現(xiàn)

出處:賀學(xué)林 發(fā)布于:2011-07-20 10:58:56

  XML和簡單對象訪問協(xié)議(Simple Object Access Protocol,SOAP)帶來了信息交換技術(shù)革命性的進(jìn)步,極大地促進(jìn)了分布式應(yīng)用的發(fā)展。XML(Extensible Markup Language)即可擴(kuò)展標(biāo)記語言,它與HTML一樣,都是SGML(STandard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)。Xml是Internet環(huán)境中跨平臺的,依賴于內(nèi)容的技術(shù),是當(dāng)前處理結(jié)構(gòu)化文檔信息的有力工具。擴(kuò)展標(biāo)記語言XML是一種簡單的數(shù)據(jù)存儲語言,使用一系列簡單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡單易于掌握和使用。目前,在基于SOAP信息交換應(yīng)用的集成化開發(fā)環(huán)境和工具中關(guān)于SOAP的技術(shù)對開發(fā)人員基本上是透明的,即屏蔽和隱藏了SOAP實(shí)現(xiàn)和處理的細(xì)節(jié)。深入了解SOAP消息的處理過程和SOAP處理器的工作機(jī)理,可以對分布式應(yīng)用進(jìn)行更加靈活地控制。

  1  SOAP概述

  簡單對象訪問協(xié)議(SOAP)是一種輕量的、簡單的、基于 XML 的協(xié)議,它被設(shè)計(jì)成在 WEB 上交換結(jié)構(gòu)化的和固化的信息。 SOAP 可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議( HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠(yuǎn)程過程調(diào)用(RPC)等大量的應(yīng)用程序。SOAP 消息基本上是從發(fā)送端到接收端的單向傳輸,但它們常常結(jié)合起來執(zhí)行類似于請求 / 應(yīng)答的模式。所有的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個包含有一個必需的 SOAP 的封裝包,一個可選的 SOAP 標(biāo)頭和一個必需的 SOAP 體塊的 XML 文檔。

  2  SOAP消息處理模型

  2.1 SOAP的應(yīng)用架構(gòu)和消息處理模型框架

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

  實(shí)際上,客戶端和服務(wù)器端的SOAP代理模塊內(nèi)部做了大量的處理工作。SOAP RPC的處理過程如圖2所示??蛻舳四K按照Web Service使用接口要求的格式和規(guī)范,通過XML處理器將客戶端的RPC調(diào)用編碼成SOAP請求消息。SOAP請求消息中按規(guī)定封裝了請求服務(wù)所必需的信息,借助傳輸協(xié)議傳送到服務(wù)器端;服務(wù)器的傳輸協(xié)議監(jiān)聽器得到傳輸?shù)膬?nèi)容,由服務(wù)器端的代理模塊按照WSDL文檔描述的Web Service接口的信息采用XML處理器對SOAP請求消息進(jìn)行解析,提取出適當(dāng)?shù)男畔ⅲ商峁┫鄳?yīng)的Web服務(wù)的對象,調(diào)用請求的方法,得到服務(wù)程序的處理結(jié)果,再按WSDL文檔的要求將服務(wù)處理結(jié)果生成SOAP響應(yīng)消息,借助傳輸協(xié)議傳回客戶端;客戶端的代理按照WSDL文檔描述的信息解析SOAP響應(yīng)消息,提取出適當(dāng)?shù)男畔⒎祷乜蛻舫绦?。在客戶端和服?wù)器端對SOAP消息進(jìn)行串行化和反串行化期間,涉及到客戶程序的數(shù)據(jù)類型與XML的類型系統(tǒng)XSD之間,以及XML的類型系統(tǒng)XSD與服務(wù)程序的數(shù)據(jù)類型之間的相互映射,還有對象參數(shù)的序列化和反序列化工作。

  當(dāng)SOAP與HTTP綁定時,服務(wù)器端的消息監(jiān)聽可以采用ASP或ISAPI處理方式。

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

  2.2 WSDL簡介

  WSDL是Web Service的描述語言,用于描述Web Service的服務(wù),接口綁定等,它以一種XML模式來描述Web Service的接口。服務(wù)的使用方根據(jù)這些描述信息來理解如何使用服務(wù)。由于描述方法和格式具有統(tǒng)一的標(biāo)準(zhǔn)和規(guī)范,因此便于由機(jī)器來自動處理描述信息。實(shí)際上,很多開發(fā)環(huán)境就是由軟件工具根據(jù)服務(wù)模塊自動生成相應(yīng)的WSDL文檔。

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

  3 實(shí)現(xiàn)SOAP處理器的功能

  由圖2所示的SOAP消息處理器的功能和過程架構(gòu),可以實(shí)現(xiàn)自行開發(fā)的SOAP處理器。

  3.1 具體的實(shí)現(xiàn)模型

  由于SOAP消息和WSDL文檔都是基于XML格式的,所以代理的工作主要是分析和處理XML文檔??梢愿鶕?jù)SOAP消息封裝格式、編碼規(guī)則、RPC表示以及WSDL文檔結(jié)構(gòu)的協(xié)議規(guī)范,采用任一種XML解析器工具來處理SOAP和WSDL這類特殊的XML文檔(如圖2所示)。本文將采用MSTK3.0中的低層API來實(shí)現(xiàn)SOAP代理,處理過程反映了技術(shù)機(jī)理和細(xì)節(jié)。將準(zhǔn)備實(shí)現(xiàn)的客戶端和服務(wù)器端的SOAP代理類命名為mySoapClient和mySoapServer。其內(nèi)部實(shí)現(xiàn)過程模型分別如圖3和圖4所示。

  3.2 具體實(shí)現(xiàn)

  下面采用VB6.0來實(shí)現(xiàn)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

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

  3.2.2 服務(wù)器端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類實(shí)例化就成為服務(wù)器端SOAP代理對象。Initialize方法利用WSDL文檔來初始化服務(wù)器端代理對象。ProcessRequest方法分析接收到的SOAP請求消息,調(diào)用相應(yīng)的Web Service方法,將結(jié)果編碼成SOAP響應(yīng)消息回傳。

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


  
關(guān)鍵詞:一種消息處理器的的設(shè)計(jì)與實(shí)現(xiàn)

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!