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

COM 呼叫 WCF 服務實戰 (一):類型化契約完整建置與註冊流程

     編輯:關於.NET

系列首篇建立完整基準:使用 **類型化契約** 服務專用字串,從 WCF 服務建立、Proxy 組件產生、強名稱簽章、GAC 安裝、COM 註冊 (Regasm),到 VBScript/VBA/VB6 調用的端到端流程。此模式提供完整型別安全、編譯期檢查、支援設定檔繫結參數調整,是企業級 COM-WCF 整合的標準做法。

步驟 1:建立 WCF 服務

  1. VS 2008 新建 **WCF Service Application** 專案 WCFServiceMoniker
  2. 定義服務契約 IService1:
[ServiceContract]
public interface IService1
{
    [OperationContract]
    string SayHello(string yourwords);
}
  1. 實作 Service1:
public class Service1 : IService1
{
    public string SayHello(string yourwords)
    {
        return string.Format("Hello World! You entered: {0}", yourwords);
    }
}
  1. Web.config 使用預設 wsHttpBinding,啟用 serviceMetadata httpGetEnabled="true" 與 MEX 端點
  2. IIS 建立虛擬目錄 WCFServiceMoniker,瀏覽 .svc 確認服務運行

步驟 2:產生強型別 Proxy 組件

  1. 方案新增 **Class Library** 專案 Client
  2. 專案屬性 → Build Events → Pre-build event:
call "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
svcutil /language:cs /config:$(ProjectDir)App.config /out:$(ProjectDir)generatedClient.cs https://localhost/WCFServiceMoniker/service1.svc?wsdl
  1. 編譯專案,自動產生 generatedClient.cs,加入專案
  2. AssemblyInfo.cs 設定 [assembly: ComVisible(true)]
  3. 簽章:專案屬性 → Signing → 勾選 Sign the assembly → 新建強名稱金鑰 WCFServiceMonikerKey.snk
  4. 加入 System.ServiceModel 參考,編譯通過產生 Client.dll

步驟 3:註冊組件至 COM

REM 批次檔 Reg.bat
gacutil /i Client.dll
%systemroot%\Microsoft.NET\Framework\v2.0.50727\Regasm Client.dll /t
REM 產生 Client.tlb 型別庫
  • GAC 安裝確保全域可用
  • Regasm /t 註冊類型庫並寫入登錄表
  • OLEView 確認 IService1 介面與 GUID (如 {4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74})

步驟 4:VBScript 調用

' CallWCFService_TypedContract.vbs
monikerString = "service:address='https://localhost/WCFServiceMoniker/Service1.svc'"
monikerString = monikerString + ", binding=wsHttpBinding"
monikerString = monikerString + ", contract={4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74}"

Set serviceMoniker = GetObject(monikerString)
WScript.Echo serviceMoniker.SayHello("I am LazyBee, My blog is https://lazybee.cnblogs.com/")
Set serviceMoniker = Nothing

圖 1:VBScript 執行成功

步驟 5:VBA (Word/Excel) 巨集調用

Sub CallWCFService_TypedContract()
    Dim monikerString As String
    Dim serviceMoniker As Object

    monikerString = "service:address='https://localhost/WCFServiceMoniker/Service1.svc'"
    monikerString = monikerString + ", binding=wsHttpBinding"
    monikerString = monikerString + ", contract={4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74}"

    Set serviceMoniker = GetObject(monikerString)
    MsgBox serviceMoniker.SayHello("I am LazyBee, My blog is https://lazybee.cnblogs.com/")
    Set serviceMoniker = Nothing
End Sub

VB6 代碼相同。

類型化契約專用字串三要素

參數範例說明
addresshttps://localhost/WCFServiceMoniker/Service1.svc服務端點位址
bindingwsHttpBinding標準繫結類型名稱 (非繫結配置名稱)
contract{GUID}註冊至 COM 的介面 GUID (大括號包裹)

優缺點總評

優點缺點
完整型別安全、IntelliSense、編譯期檢查需客戶端安裝 .NET Framework 2.0+
支援設定檔繫結參數 (bindingConfiguration)需產生/部署/註冊 Proxy 組件 (GAC + Regasm)
效能最佳 (無中繼資料下載解析)服務介面變更需重新產生 Proxy、重新部署
支援所有繫結功能 (安全性、可靠會話、交易...)不適合無 .NET 環境 (如純腳本、舊版 Office 無 VSTO)

部署檢查清單

  • [ ] 目標機器安裝 .NET Framework 2.0 SP1 以上
  • [ ] Client.dll 安裝至 GAC (gacutil /i)
  • [ ] Regasm Client.dll /t 成功註冊類型庫
  • [ ] 防火牆允許客戶端連線服務端口 (預設 80/443)
  • [ ] 服務端 Web.config 身分識別 <dns value="localhost" /> 與客戶端呼叫主機名一致

總結

類型化契約是 **功能最完整、效能最佳、型別最安全** 的 COM-WCF 整合模式,代價是部署複雜度最高。適用於:企業內部可控環境、需大訊息/複雜繫結配置、追求開發時型別安全的專案。後續三篇將介紹漸進式降低部署依賴的 MEX、WSDL、設定檔技術。

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