在ASP程序中調用Web Service
微軟投入了大量資金來推銷其.NET的各種優點,其中.NET最大的優點之一就是微軟始創的XML Web Services。XML Web Services可以將你的程序和以前定制的DLL和COM/DCOM組建分離(避免陷入DLL陷阱),然后將這些功能設計成為XML Web Services,讓其他應用程序也可以訪問和調用這些功能(比如:網站、分布式程序)(關于怎樣在.NET中建立和使用XML Web Services,請參考這篇文章:http://aspnet.4guysfromrolla.com/articles/062602-1.aspx)。那么,當你考慮提升現有ASP程序性能的時候,怎樣將其與已經開發的XML Web Services結合呢?
本文的目的就是演示怎樣將最新的XML Web Services和現有ASP程序結合起來。通過將一些具體的業務功能寫成XML Web Services并且將這些XML Web Services與ASP程序完美結合,現有的ASP程序就可以象ASP.NET程序一樣共同“分享”XML Web Services的好處了。當你需要提升現有ASP程序的性能并且和已經開發的ASP.NET同步,但是有沒有時間和精力將這些程序完全修改為ASP.NET程序的時候,我們就可以考慮將ASP和XML Web Services結合使用。
本文將要用到的例子是基于以下現實需要的:在B2B電子商務中,對于一些比較固定的客戶,我們可能對他們有一些特殊的折扣。下文中我們將建立一Web Services,這個 Web Services的功能就是針對特殊的客戶按照一定規則計算折扣,然后,我們將其與一個簡單的ASP程序結合起來應用。
數據庫
我們在這里使用微軟Access中自帶的NorthWind數據庫,當然,我們不會照盤全收,我們需要對數據庫的“Products”數據表表結構作一些小小的修改:增加一個保存商品實際價格的“CostPrice”字段(我們將填入一些隨機數據)(這個數據庫可以在這里下載到:http://www.4guysfromrolla.com/webtech/code/asptonet.zip)
Web Service
在文章“Creating and Consuming a Web Service”中已經討論過,我們可以使用文本編輯器來建立Web Services,比如:WEB Matrix Projext或者VS.NET等工具。文中我們將試驗使用VS.NET來建立Web Service。
首先,在VS.NET中建立一個新的ASP.NET工程,然后,刪除程序建立的Web Form,增加一個新的Web Service文件(命名為:eCommerce.asmx),在這個Web Service中,將默認的名字空間修改為ClassicASP_nDotNET.eCommerce,并且增加一個名為CalculateDiscountCompanyX的方法。
WEB方法CalculateDiscountCompanyX是一個用于計算公司CompanyX折扣的簡單函數(當然,更為健壯的解決方法是寫一個通用的函數比如:CalculateDiscount(CompanyID),在這個函數中CompanyID專門用于定義特定的公司編號,然后,程序根據公司編號查找數據庫得到具體的公司名稱,并對其做出折扣計算。我們這里主要的目的在于演示XML Web Services和ASP程序的結合使用,因此,只用需要一些簡單函數。)
在我們的應用中,假設對公司CompanyX的最小折扣為10%,公司最低純利潤為7.5%,這些具體的折扣和利潤都是固化寫在程序中的。
WEB方法CalculateDiscountCompanyX相當簡單,將用到以下一些參數:
1、UnitPrice:建議零售價格,數據類型為Double;
2、CostPrice:商品的實際價格,也就是進貨價格,數據類型為Double;
3、AccessCode:該Web Services的安全密碼,數據類型為String;
如果函數計算出現錯誤,將返回-1,以下是函數源代碼:
<WebMethod()> _
Public Function CalculateDiscountCompanyX(ByVal UnitPrice As Double, _
ByVal CostPrice As Double, _
ByVal AccessCode As String) As Double
Dim dblDiscount As Double, _
dblMarkup As Double, _
dblMinMarkup As Double, _
dblMinClientDiscount As Double
dblMarkup = (1.3) '期望利潤
dblMinMarkup = (1.075) ' 最低利潤
' 對客戶的期望最低折扣
dblMinClientDiscount = (0.1)
Try
If AccessCode = "p455w0rd" Then
' 根據利潤計算折扣
dblDiscount = FormatNumber(((UnitPrice - (CostPrice * dblMarkup))), 2)
' 檢查折扣是否合適na
If dblDiscount + 0 <= (UnitPrice * dblMinClientDiscount) Then
dblDiscount = FormatNumber((UnitPrice * dblMinClientDiscount), 2)
End If
' 檢查是否有最低利潤
If (UnitPrice - dblDiscount) <= (CostPrice * dblMinMarkup) Then
dblDiscount = FormatNumber((UnitPrice - (CostPrice * dblMinMarkup)), 2)
End If
Return dblDiscount
Else
Return -1 '密碼錯誤
End If
Catch ex As Exception
Return -1
End Try
End Function
將Web Services和ASP程序結合起來
為了使ASP和Web Services相互通訊變得相對簡單,需要首先下載安裝MS SOAP Toolkit 2.0(地址為:http://msdn.microsoft.com/SOAP/),這樣,就可以使用SOAP來實現ASP和Web Services的通訊,這將使ASP程序和Web Services通訊與使用其他方法相比變得簡單。事實上,在4Guys網站有一篇文章專門介紹SOAP的使用,這篇文章就是:Creating Web Services using ASP(地址:http://www.4guysfromrolla.com/webtech/070401-1.shtml)。
這樣,ASP頁面就可以使用剛才我們建立的Web Service計算公司CompanyX的商品折扣,為了使程序看上去更加簡單和條例,我們將SOAP調用從主程序移出來,專門寫一個自己的函數:CalculateDiscount。由于使用了SOAP,所以這個函數調用Web Service比較簡單,只有幾行代碼,程序代碼如下:
Public Function CalculateDiscount(UnitPrice, CostPrice)
SET objSoapClient = Server.CreateObject("MSSOAP.SoapClient")
objSoapClient.ClientProperty("ServerHTTPRequest") = True
' 下面的鏈接需要修改為我們具體網站的鏈接
Call objSoapClient.mssoapinit("http://localhost/ClassicASP_n_DotNET/" & _
"eCommerce.asmx?WSDL", "eCommerce")
' 使用SOAP對象調用Web Service函數
CalculateDiscount = objSoapClient.CalculateDiscountCompanyX(UnitPrice, _
CostPrice, "p455w0rd")
End Function
以上的程序相當的明了,首先mssoapinit方法用WSDL為調用Web Service作準備,然后真正計算折扣的函數CalculateDiscountCompanyX被調用,將折扣計算出來并且返回給函數CalculateDiscount。
在我們提供的源代碼下載包里面,意思的函數都可以在companyx_products.asp頁面找到,ASP頁面將遍歷整個“Products”數據表,在現實每條記錄的時候都將調用“CalculateDiscount”函數來計算公司CompanyX的折扣。
結論
文章介紹了怎樣用ASP來和Web Service通訊,另外,我們可以知道,將一些功能模塊設計成為Web Service可以讓ASP象ASP.NET一樣調用這些模塊。
喻凱(編譯)
來源:月光博客