首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

COM 呼叫 WCF 服務實戰 (三):WSDL 契約動態調用無需註冊類型

     編輯:關於.NET

系列第三篇介紹 **WSDL 契約** 服務專用字串:當服務端為安全考量關閉 MEX 端點、或無法部署 Proxy 組件時,透過 HTTP GET 取得 WSDL 內容,動態建立通道調用 WCF。無需註冊類型、無需 GAC、無需 MEX,適合極度受限的 COM 環境 (如舊版 Office 巨集、純腳本環境)。

適用場景

  • 服務端 **未暴露 MEX 端點** (安全合規要求)
  • 客戶端環境 **無 .NET Framework**、無法註冊 COM 可見組件
  • 不想部署/維護 Proxy 組件,追求零部署調用

前置條件:服務端與前兩篇相同

WCF 服務 IService1 / Service1、wsHttpBinding、https://localhost/WCFServiceMoniker/Service1.svc、MEX 端點可選。本篇重點在**客戶端腳本取得 WSDL 並構建專用字串**。

VBScript 完整實作

' CallWCFService_wsdl.vbs
'---------------------------------------------------------------
' WSDL service moniker example
'---------------------------------------------------------------

' 1. 以 XMLHTTP 同步下載 WSDL 內容
Set xmlhttp = CreateObject("Msxml2.XMLHTTP")
xmlhttp.open "GET", "https://localhost/WCFServiceMoniker/Service1.svc?wsdl", False
xmlhttp.send
wsdlstr = xmlhttp.responseText

' 2. 構建服務專用字串:四大必要元素
mexMonikerString = "service:address='https://localhost/WCFServiceMoniker/Service1.svc'"
mexMonikerString = mexMonikerString + ", wsdl='" & wsdlstr & "'"
mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_IService1, bindingNamespace='https://tempuri.org/'"
mexMonikerString = mexMonikerString + ", contract=IService1, contractNamespace='https://tempuri.org/'"

' 3. 建立專用字串物件並調用
Set mexServiceMoniker = GetObject(mexMonikerString)
WScript.Echo mexServiceMoniker.SayHello("I am LazyBee, My blog is https://lazybee.cnblogs.com/")

Set mexServiceMoniker = Nothing
Set xmlhttp = Nothing

專用字串四大必要參數解析

參數來源說明
address服務 .svc URL實際通訊端點
wsdlHTTP GET ?wsdl 回傳 XML完整 WSDL 文檔字串,**單引號包裹**,內部單引號需轉義
binding / bindingNamespaceWSDL <wsdl:binding name="...">繫結名稱與命名空間,區分大小寫
contract / contractNamespaceWSDL <wsdl:portType name="...">契約名稱與命名空間,區分大小寫

關鍵提示:若服務未自訂命名空間,預設均為 https://tempuri.org/。從 WSDL 或 MEX 端點檢視可確認實際值。

執行結果驗證

圖 1:VBScript 執行成功,顯示服務回應

優缺點對比

維度類型化契約MEX 契約WSDL 契約
需 .NET Framework是 (產生 Proxy)否否
需註冊組件 (Regasm/GAC)是否否
需服務端 MEX 端點否是否
需手動取得 WSDL否否是 (XMLHTTP 下載)
支援設定檔繫結參數是否否
型別安全/編譯期檢查完整執行期執行期
適用環境標準 .NET/COM 混合無 .NET、有 MEX無 .NET、無 MEX、極度受限

常見問題與對策

  • WSDL 字串過長導致專用字串超過長度限制:罕見,若發生可將 WSDL 存檔本地,改用 wsdl='file://path' 語法 (需測試支援度)
  • 命名空間不匹配:嚴格區分大小寫,從 WSDL 複製貼上最保險
  • 繫結名稱錯誤:WSDL 中可能有多個 binding,需選對應 wsHttpBinding 的那個
  • 安全性攔截:服務若需 Windows 認證,腳本執行身份必須有權限;匿名服務則無問題

總結

WSDL 契約專用字串提供 **零部署、無 MEX 依賴、無 .NET 運行時** 的 WCF 調用路徑,代價是需手動構建包含完整 WSDL XML 的專用字串。適合:

  • 舊版 Office 巨集環境 (Office 2003/2007 無 VSTO)
  • 純腳本自動化腳本
  • 安全合規要求關閉 MEX 的服務

下一篇將總結全系列四種契約模式的選型決策樹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved