第一步:創建WCF服務
上一篇我們使用類型化契約的服務標記在COM中調用WCF服務,不過這個有一 定的局限性,因為需要注冊類型,所以需要.Net FrameWork,但是在很多情況下COM客戶端所在的環境沒有 .Net Framework,比如說在Excel中,需要調用一個WCF服務來計算某個單元格的值,而且這個Excel文件可 能分發到許多機器上,你總不能給每台機器都裝一個.Net Framework,同時都去給它注冊所需的類型吧。 針對這種場景,我們可以使用MEX契約的服務標記來動態得到服務契約,這樣就可以滿足我們上面的場景 的要求了。下面就讓我們開始吧!
這個和上一篇的完全一樣,具體請參見COM(VB/VBA/Script)利用服務標記調用WCF服務之一使用類型化 契約的第一步,如果您曾經按照上一篇文章做過相應的測試,你就可以直接使用已經建好的服務了。 第 二步:在Script中調用WCF服務 1 這裡大家對比前面一篇就可以看到,這裡沒有任何創建客戶端庫以及注 冊等步驟,而是直接進行調用WCF服務了。在寫調用代碼之前,首先讓我們打開服務的WSDL來看看,因為 這裡有我們需要的服務標記信息。 2 我們打開http://localhost/WCFServiceMoniker/Service1.svc? wsdl之後,如下圖所示:
3 下面就是創建我們的Script文件了,我們起名為CallWCFService_mex.vbs,內容如下:
1'--------------------------------------------------------------- 2' MEX service moniker example 3'--------------------------------------------------------------- 4' Create a string for the service moniker specifying the address 5' to retrieve the service metadata from 6mexMonikerString = "service:mexAddress='http://localhost/WCFServiceMoniker/Service1.svc/mex'" 7mexMonikerString = mexMonikerString + ", address='http://localhost/WCFServiceMoniker/Service1.svc'" 8mexMonikerString = mexMonikerString + ",binding=WSHttpBinding_IService1, bindingNamespace='http://tempuri.org/'" 9mexMonikerString = mexMonikerString + ", contract=IService1, contractNamespace='http://tempuri.org/'" 10' Create the service moniker object 11Set mexServiceMoniker = GetObject(mexMonikerString) 12' Call the service operations using the moniker object 13WScript.Echo mexServiceMoniker.SayHello("I am LazyBee, My blog is http://lazybee.cnblogs.com/ ") 14Set mexServiceMoniker = nothing 15
Mex地址、服務地址、綁定及命名空間、服務契約及命名空間四部分內容。在這裡服務地址就是上圖所 標注的地址,當然Mex地址就是在其後面增加一個mex了,這個對大家來說應該都很好理解。綁定及服務也 是上圖所標注,不過注意其大小寫,因為在服務標記中是區分大小寫的,由於我們沒有給服務契約和綁定 指定命名空間,缺省就是“http://tempuri.org/”了。
4 保存之後,直接雙擊運行,你就可以看到運行結果了:
第三步:在VBA的宏中調用WCF服務
1 在VBA中的代碼和上一篇文章COM(VB/VBA/Script)利用服務標記調用WCF服務之一使用類型化契約的 一樣,只是將服務標記字符串和上面一樣做相應的更改就可以了,如下所示:
2 直接運行,同樣能得到上圖類似的結果。
1Sub CallWCFService_Mex() 2 Dim strMonikerString As String 3 Dim serviceMoniker As Object 4 '--------------------------------------------------------------- 5 ' MEX service moniker example 6 '--------------------------------------------------------------- 7 ' Create a string for the service moniker specifying the address 8 ' to retrieve the service metadata from 9 mexMonikerString = "service:mexAddress='http://localhost/WCFServiceMoniker/Service1.svc/mex'" 10 mexMonikerString = mexMonikerString + ", address='http://localhost/WCFServiceMoniker/Service1.svc'" 11 mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_IService1, bindingNamespace='http://tempuri.org/'" 12 mexMonikerString = mexMonikerString + ", contract=IService1, contractNamespace='http://tempuri.org/'" 13 ' Create the service moniker object 14 Set mexServiceMoniker = GetObject(mexMonikerString) 15 16 ' Call the service operations using the moniker object 17 MsgBox mexServiceMoniker.SayHello("I am LazyBee, My blog is http://lazybee.cnblogs.com/ ") 18 19 Set mexServiceMoniker = Nothing 20End Sub 21 22
注:在VB6中調用和上面的代碼一樣。
文章來源:http://lazybee.cnblogs.com
本文配套源碼:http://www.bianceng.net/dotnet/201212/756.htm