把.Net整合進其他平臺
當(dāng)應(yīng)用程序在不同的操作系統(tǒng)以及涉及不同的程序平臺時,這個集成問題變得尤其復(fù)雜。雖然說,Web服務(wù)承諾可以減輕程序員完成集成任務(wù)的困難程度,但是也可能給程序員們帶來一些意想不到的麻煩。在這里我們將把一個ASP.net應(yīng)用程序和一個PHP Web服務(wù)連結(jié)起來,以學(xué)習(xí)一些整合分布式應(yīng)用程序的方法,以及必要的應(yīng)對措施,包括運行什么以及不用去做什么。
這個Web服務(wù)在一個Apache服務(wù)器上運行,并且使用PHP開發(fā)。它從各種微軟新聞組檢索新聞?wù)约八鼈兊年P(guān)聯(lián)的文本。即使由這個服務(wù)提供的數(shù)據(jù)可以直接使用內(nèi)部的.Net對象存取,但是這個服務(wù)還是將使用并提供一個連接到非.Net平臺上的不錯的演示。我們這里要討論的實例基于.Net beta 2版。
創(chuàng)建一個Web服務(wù)代理
Visual Studio.NET提供了一個出色的機制用于自動地生成可用于存取遠程Web服務(wù)的代理對像。因此,要首先嘗試使用這些函數(shù)來導(dǎo)入由PHP服務(wù)提供的Web服務(wù)描述語言(Web Services Description Language,WSDL)文件。 還可以使用.Net SDK的WSDL.exe命令行公用程序。不幸的是,在使用VS.net向?qū)?dǎo)入WSDL之后,并不能成功地創(chuàng)建一個代理。所以我必須把導(dǎo)入原始的WSDL文件后由VS.Net生成的文件轉(zhuǎn)換為WSDL:
1. 把模式域名空間從http://www.w3.org/1999/XMLSchema改成http://www.w3.org/01/XMLSchema 然后所有的當(dāng)WSDL導(dǎo)入過程中由VS.Net添加的”q”域名空間。
2. 刪除 xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/和xmlns: mime="http://schemas.xmlsoap.org/wsdl/mime/" 名字空間,因為這個應(yīng)用程序中不需要包含這些。
3. 刪除類型元素,因為原始的 WSDL文檔 并沒有包含Web服務(wù)的模式信息的指定的元素區(qū)段。
4. 改變輸入輸出元素消息屬性值為包含tns域名空間前綴的形式:
< portType name="nntpSoapPortType">
< operation name="getheaders" parameterOrder="newsgroup numitems">
< input message="tns:getheaders" />
< output message="tns:getheadersresponse" />
< /operation>
< operation name="getarticle" parameterOrder="newsgroup article">
< input message="tns:getarticle" />
< output message="tns:getarticleresponse" />
< /operation>
< /portType> 在進行了下面的這些微小的改變,VS.Net向?qū)軌蜃x取WSDL并且自動地生成一個代理。在編譯了這個代理之后,它被包含在一個ASP.NET頁面中。然而,當(dāng)這個ASP.Net頁面被執(zhí)行:“ message does not have a correct SOAP root XML tag.”,這個錯誤被當(dāng)作一個SOAP錯誤從Web服務(wù)中返回。為了地評估這個錯誤,代理調(diào)用被一個名為Proxy Trace的公用程序使用,以便代理生成SOAP包裝。這可以通過把下列代碼添加進ASP.Net頁面來實現(xiàn):