最近一位客戶需要在ASP裡面呼叫Web Service來幫他進行產品價格的查詢,於是乎我就用ASP.NET建立了一個Web Service來提供給客戶在ASP裡面透過SoapToolKit 3.0來呼叫.
不過因為客戶要傳遞的資料需要可以一次傳遞多筆,然後回傳的資料也是多筆的,並且希望過程中可以不要自己剖析xml, 並且可以將回傳結果直接匯入他們最熟悉的RecordSet物件.這篇文章就是描述如何達成這個任務的過程.
首先,客戶在ASP裡將要查詢的產品代號填入到Recorset物件裡,然後再將Recordset的資料儲存到DOMDocument物件裡面
Set rs = Server.CreateObject("ADODB.RecordSet")
Set oXMLDOMSend = Server.CreateObject("Msxml2.DOMDocument")
rs.Save oXMLDOMSend, 1
然後取出DOMDocument物件的xml字串,此xml字串就是內含多筆資料的查詢字串,接下來就是透擴SoapToolkit將此字串傳送給Web Service
Dim soapClient
set soapclient = CreateObject("MSSOAP.SoapClient")
soapclient.mssoapinit "http://192.168.0.1/WebService1.wsdl"
soapclient.GetPrice(oXMLDOMSend.xml,result)
在上面的程式碼裡,http://192.168.0.1/webservice1.wsdl是我們用ASP.NET建立的web Service,此Web Service裡面有一個GetPrice()的WebMethod,此WebMethod有2個參數,第一個是傳入給Web Service的查詢字串,內含多筆產品代號,第2個參數則是用來取得查詢結果的字串
接下來用VS.NET建立一個WebService,此Web Service會接受使用者傳入的產品代號,然後查詢完成後在將結果以字串方式回傳
[WebMethod]
public void GetPrice(string xml,out string result)
{....}
因為使用者所傳入的是一個以xml格式的字串,裡面含有使用者要查詢的產品代號,要取出這些資訊最快的方式就是透過DataSet的Loadxml()方法將該字串讀入到DataSet裡面,只要進入到DataSet裡面後,我們就可以很方便的取出裡面的資訊了
StringReader sr = new StringReader(xml);
DataSet ds = new DataSet();
ds.ReadXml(sr);
因為我們已經將查詢的資訊成功匯入到DataSet了,所以取出查詢的產品代號也不是甚麼大問題了,只要熟悉DataSet的一些架構就可以很簡單的取出想要的資訊.
到這裡其實都還很順利,比較麻煩的其實是在後半段,該如何把查詢完的結果傳回給使用者呢?因為使用者不希望傳回的xml字串還要自己用xpath去剖析,那太累了,最好是可以讓它載入到RecordSet裡面,以方便它接下來取出值.
為了達到使用者的要求,我們必須在ASP.NET裡面建立RecordSet物件,然後將結果塞入到 Recordset物件裡,最後再將RecordSet轉成xml物件回傳給使用者, 如此使用者才能成功把查詢完的結果xml字串匯入到RecordSet物件裡.
想要在ASP.NET裡建立RecordSet物件的話,首先必須加入COM 物件到Reference裡面

另外,後來需要將RecordSet會出成xml字串,所以需要透過DOMDocument物件,此物件是與RecordSet搭配使用,並無法用.NET之XmlDocument物件取代,所以必須加入此物件到Reference.

加入完成後,你將可以在Reference裡看到結果如下

接下來,我們就可以在ASP.NET裡去建立RecordSet物件了.
MSXML2.DOMDocumentClass dom = new MSXML2.DOMDocumentClass();
ADODB.RecordsetClass rs = new RecordsetClass();
rs.Fields.Append("entity", DataTypeEnum.adVarChar, 8, FieldAttributeEnum.adFldUnspecified, Missing.Value);//建立欄位
rs.Fields.Append("part", DataTypeEnum.adVarChar, 20, FieldAttributeEnum.adFldUnspecified, Missing.Value);
rs.Fields.Append("site", DataTypeEnum.adVarChar, 8, FieldAttributeEnum.adFldUnspecified, Missing.Value);
rs.Fields.Append("type", DataTypeEnum.adVarChar, 10, FieldAttributeEnum.adFldUnspecified, Missing.Value);
rs.Fields.Append("date", DataTypeEnum.adDate, 0, FieldAttributeEnum.adFldUnspecified, Missing.Value);
rs.CursorLocation = CursorLocationEnum.adUseClient;
rs.Open(Missing.Value, Missing.Value, CursorTypeEnum.adOpenUnspecified, LockTypeEnum.adLockUnspecified, -1);
rs.AddNew(Missing.Value, Missing.Value); //加入新列到rs
rs.Fields["entity"].Value = "ACL"; //設定新列的值
rs.Fields["part"].Value = "PCM-5820-E0B2";
rs.Fields["site"].Value = "4000";
rs.Fields["type"].Value = "SUPPLY_MRP";
rs.Fields["date"].Value = "2009-01-05T00:00:00";
rs.Save(dom,PersistFormatEnum.adPersistXML);
result = dom.xml;
在上面的程式碼裡,我們不但建立了RecordSet物件,並且還在此RecordSet物件裡建立了一些欄位,接下來則是加入查詢結果到此RecordSet裡,在範例中我直接塞固定值給他,其實應該根據查詢結果跑回圈,一個個將資料塞入到RecordSet物件,當資料完全填入到RecordSet後,再將RecordSet的值轉存到DOMDocument物件中,最後是取出xml字串回傳.
此xml字串回傳給使用者後,使用者可以簡單的以DOMDocument物件的loadXML()將其匯入,然後在利用RecordSet的Open()來開啟此DOMDocument物件,這樣就可以還原回傳的xml字串到RecordSet物件了.
經過這樣多重的轉換後,使用者可以不用自己剖析回傳的字串,大大減輕的他們的負擔,過程中ASP利用SoapToolKit來呼叫ASP.NET寫的WebService,也算是一種讓ASP可以利用到Web Service強大功能的一個solution,對未來要擴充也比較有彈性.