.Net整合其他平台的一些探討

來源:互聯網
上載者:User

整合分布式應用程式經常是一件非常困難並且錯綜複雜的任務,即使是最富有經驗的開發人員也可能會覺得頭疼。當應用程式在不同的作業系統以及涉及不同的程式平台時,這個整合問題變得尤其複雜。雖然說,Web服務承諾可以減輕程式員完成整合任務的困難程度,但是也可能給程式員們帶來一些意想不到的麻煩。在這裡我們將把一個ASP.net應用程式和一個PHP Web服務連結起來,以學習一些整合分布式應用程式的方法,以及必要的應對措施,包括運行什麼以及不用去做什麼。

這個Web服務在一個Apache伺服器上運行,並且使用PHP開發。它從各種微軟新聞群組檢索新聞摘要以及它們的關聯的文本。即使由這個服務提供的資料可以直接使用內部的。Net對象存取,但是這個服務還是將使用並提供一個串連到非。Net平台上的不錯的示範。我們這裡要討論的執行個體基於。Net beta 2版。

建立一個Web服務代理

Visual Studio.NET提供了一個出色的機制用於自動地產生可用於存取遠程Web服務的代理對像。因此,要首先嘗試使用這些函數來匯入由PHP服務提供的Web服務描述語言(Web Services Description Language,WSDL)檔案。 還可以使用.Net SDK的WSDL.exe命令列公用程式。不幸的是,在使用VS.net嚮導匯入WSDL之後,並不能成功地建立一個代理。所以我必須把匯入原始的WSDL檔案後由VS.Net產生的檔案轉換為WSDL:

◆把模式網域名稱空間從http://www.w3.org/1999/XMLSchema改成http://www.w3.org/2001/XMLSchema 然後清除所有的當WSDL匯入處理程序中由VS.Net添加的”q”網域名稱空間。

◆刪除 xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/和xmlns: mime="http://schemas.xmlsoap.org/wsdl/mime/" 名字空間,因為這個應用程式中不需要包含這些。

◆刪除類型元素,因為原始的 WSDL文檔 並沒有包含Web服務的模式資訊的指定的元素區段。

◆改變輸入輸出元素訊息屬性值為包含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嚮導能夠讀取WSDL並且自動地產生一個代理。在編譯了這個代理之後,它被包含在一個ASP.NET頁面中。然而,當這個ASP.Net頁面被執行:“ message does not have a correct SOAP root XML tag.”,這個錯誤被當作一個SOAP錯誤從Web服務中返回。

為了精確地評估這個錯誤,代理調用被一個名為Proxy Trace的公用程式使用,以便代理產生SOAP封裝。這可以通過把下列代碼添加進ASP.Net頁面來實現:

msNews.Proxy = new System.Net.WebProxy( http://localhost:8080);

在察看了由.Net代理產生的SOAP封裝之後,我有點奇怪為什麼會返回這個錯誤,因為實際上一個相對的SOAP封裝被產生並被發送到Web服務。即使在嘗試了好幾個轉化成代理代碼之後這個錯誤依然持續。程式碼片段列表2顯示了從PHP Web服務返回的完整的SOAP錯誤封裝。

在使用VS.Net中建立的代理對象的好幾個把ASP.Net頁面與PHP Web服務連結的不成功的嘗試之後,我決定從頭開始建立SOAP封裝以便執行更有效程式調試。{起先,它看起來好像由.Net代理產生的模式網域名稱空間可能是問題的關鍵,因為.Net使用2001模式規範而PHP服務使用的是1999版本的規範。

然而,我把自訂的SOAP封裝改為用1999版本代替2001版本,錯誤依然存在。在嘗試了好幾個其他的小的改變之後,我決定把SOAP封裝使用的網域名稱空間首碼和本文元素從soap (由.Net代理產生)改為SOAP - ENV,因為我看見在SOAP錯誤資訊中返回了SOAP - ENV首碼。(見代碼2)這表面上看上去微不足道的改變竟解決了問題!當處理任何請求的時候,PHP服務顯然需要SOAP - ENV首碼,而拒絕不包含SOAP - ENV首碼的要求。

建立一個自訂代理

既然已經瞭解了為什麼Web服務返回一個SOAP錯誤,我們就可以建立一個自訂代理來產生網服務期待的SOAP封裝。雖然建立一個自訂SOAP封裝肯定比使用一個由VS.net或者WSDL.exe公用程式產生的SOAP封裝要花更多的時間,但是這樣做可以完全控制封裝的內容。為了開始建立自訂代理,我建立一個名為msnewsserviceproxy的包含兩個欄位的新類:

以下為引用的內容:

public class MSNewsServiceProxy {
string _uri;

string _soapAction;

}

uri欄位儲存了Web服務的位置,而_soapAction欄位儲存了將要使用SOAP封裝發送的SOAPAction資料頭的名稱。在MSNewsServiceProxy類之內,添加CreateSoapEnvelope (),SendSoapEnvelope ()和FilterResult ()這三個方法。這些方法產生SOAP封裝請求,把它發送到Web服務,然後過濾返回的SOAP封裝。讓我們逐一的看看每個方法。注意代碼在SOAP封裝的根項目上添加一個SOAP - ENV網域名稱空間首碼。Web服務顯然需要這個特定的首碼,而拒絕任何不包含這個首碼的資訊。因為VS.net產生的代理髮送一個soap網域名稱空間首碼(而不是SOAP - ENV),所以它的訊息被拒絕。Web服務不應該需要一個特定的網域名稱空間首碼而為此拒絕不帶此首碼的訊息,但是網域名稱空間問題也是你必須注意要想使工作更好的完成,要執行一些看上去不{0>可思議的事情。

在SOAP封裝被建立之後,SendSoapEnvelope ()方法(見程式碼片段4)使用了幾個System.Net和System.IO網域名稱空間中的類來把這個封裝發送到Web服務中。代碼首先通過把_uri變數傳送到物件建構器來建立一個HttpWebRequest對象。其次,與這個請求相關聯的相應的Method,ContentType和Header都將被發送。

然後一個StreamWriter對象和HttpWebRequest對象的請求流相關聯,SOAP封裝就被使用StreamWriter的Write ()方法寫到流中。

從Web服務返回的SOAP封裝被HttpWebResponse對象的SendSoapEnvelope ()方法獲得。

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

如果應答不是空值,它將被載入一個XMLTextReader,XMLTextReader被用來填充XmlDocument對象。然後從這個方法中返回XmlDocument對象。

FilterSoapEnvelope ()方法分析SOAP應答封裝並把從Web服務中返回的資料裝入自訂代理的“消費者”使用的XmlDocument對象:

以下為引用的內容:

private XmlDocument
FilterSoapEnvelope(

XmlDocument doc) {

XmlDocument filterDoc =new XmlDocument();

XmlNode result = doc.SelectSingleNode("//results");

XmlNode resultImport = filterDoc.ImportNode(result,true);

filterDoc.AppendChild(resultImport);

return filterDoc;

}

雖然過濾器可以使用好幾種方法執行,但是FilterSoapEnvelope ()方法依靠XPath語句可以在應答SOAP封裝中得到結果元素。

微軟新聞群組PHP Web服務展示了允許取得新聞群組新聞摘要的兩種方法:getheaders ()和getmessage ()。 你可以看到如何在自訂代理類中使用這兩種方法(見程式碼片段5)。 注意每個方法中的代碼傳遞Web服務方法名被調用到CreateSoapEnvelope ()方法和任何使用這個方法關聯的參數。 在SOAP封裝被發送以及應答被接受之後,FilterSoapEnvelope ()方法被調用來把返回的資料載入到一個XmlDocument對象中,同樣,這個對象也是代理“消費者”使用的。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。