COM+ 整合:Web 裝載

這個範例示範如何從 COM+ 應用程式將介面公開為 Windows Communication Foundation (WCF) 服務,以及如何從 WCF 用戶端呼叫此服務。這個範例是由用戶端主控台程式 (.exe) 以及已在 COM+ 中註冊的 Enterprise Services 程式庫應用程式 (.dll) 所組成。

ms751523.note(zh-tw,VS.90).gif注意:
此範例的安裝程序與建置指示位於本主題的結尾。

ms751523.note(zh-tw,VS.90).gif注意:
這個範例的 Visual Basic 版本必須設定為伺服器應用程式,而且必須是跨處理序 (Out Of-Process) 裝載,才能在 64 位元版本的 Windows 作業系統上執行。如需如何將範例設定為伺服器應用程式的詳細資訊,請參閱設定 COM+ 應用程式 (本頁面可能為英文)。

Enterprise Services 應用程式包含單一元件,此元件會實作公開數學方法 (Add、Subtract、Multiply 和 Divide) 的單一 ICalculator 介面。

// Define the component's interface.
public interface ICalculator
{
    double Add(double n1, double n2);
    double Subtract(double n1, double n2);
    double Multiply(double n1, double n2);
    double Divide(double n1, double n2);
}

這個介面會公開做為定義要求-回覆通訊模式的服務合約。用戶端會對數學作業提出同步要求,而服務和基礎元件則以結果回覆。您可以在主控台視窗中看到用戶端活動。

服務由網際網路資訊服務 (IIS) 以同處理序 (In-Process) 方式裝載,並且會由傳送至服務的第一則訊息啟動。ESCalculatorService 類別實作會計算並傳回適當的結果。

// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}
ms751523.note(zh-tw,VS.90).gif注意:
此類別不包含任何 ServiceModel 特定的程式碼,而只是可透過 Enterprise Services 屬性賦予屬性的一般 Enterprise Services 組件,此組件會經過簽署並新增至全域組件快取 (GAC)。

COM+ Service Model Configuration Tool (ComSvcConfig.exe) 會用來為選取的介面新增支援服務。您可以使用下列語法執行這項工作。

ComSvcConfig.exe /install /application:ServiceModelSample /contract:ServiceModelSample.ESCalculator,ICalculator hosting:was /webDirectory:ServiceModelSamples /mex /verbose

在本例中,工具會為 ServiceModelSample.ESCalculator 元件的 ICalculator 介面新增服務,而此元件位於 ServiceModelSample 應用程式中。IIS 會在 ServiceModelSample 虛擬目錄中裝載服務。新增的服務會公開用來與服務進行通訊的單一端點。根據預設,用於與服務通訊的端點位址是建構自元件的 ProgID (即 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc),但是您可以變更 .svc 服務檔案名稱,修改這個服務端點位址。工具會將服務繫結的組態新增至 Web.config 檔案。服務繫結的組態預設為標準 wsHttpBinding 繫結,此項繫結會提供使用 SOAP 1.2 的 HTTP 通訊以及規範定址與安全性的 Web 服務標準。

此工具還會在 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex 上公開中繼資料交換 (MEX) 端點,並在 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc?wsdl 公開可從瀏覽器透過 HTTP GET 存取 WSDL 中繼資料的功能。您可以省略 /mex 工具選項來停用這些中繼資料功能。

服務合約直接衍生自 ICalculator 介面,而且相當於下列 ServiceContract 定義。

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

用戶端會使用Service Metadata Utility Tool (Svcutil.exe) 產生的用戶端,對合約進行通訊。用戶端會包含在 generatedClient.cs 檔案中。這個公用程式會擷取服務的中繼資料,然後產生用來對某個合約類型進行通訊的用戶端。裝載的服務必須可用來產生 Proxy 程式碼,因為要用它來擷取更新的中繼資料。您可以從用戶端目錄中的命令提示字元執行下列命令,以產生具型別的 Proxy:

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex /out:generatedClient.cs

如果在指定的合約上提供產生的用戶端以進行通訊,這個用戶端便可以設定適當的位址和繫結來存取指定的服務端點。和服務一樣,用戶端也會使用組態檔 (App.config) 來指定要通訊的端點。用戶端的端點組態是由組態名稱、服務端點的絕對位址、繫結和合約所組成。

<system.serviceModel>
  <client>
    <endpoint
      address="https://localhost/ServiceModelSamples/servicemodelsample.escalculator.svc/ICalculator" 
      binding="wsHttpBinding" 
      bindingConfiguration="comNonTransactionalBinding" 
      contract="ICalculator" />
  </client>
  <bindings>
    <wsHttpBinding>
          <binding name="comNonTransactionalBinding" >
        <reliableSession enabled="true"/>
      </binding>
    </wsHttpBinding>
  </bindings>
</system.serviceModel>

用戶端實作會建構所產生之用戶端的執行個體。然後,這個執行個體就可以開始與服務通訊。

// Create a client.
CalculatorClient client = new CalculatorClient();

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

當您執行範例時,作業要求和回應會顯示在用戶端主控台視窗中。這可以說明如何在 WCF 用戶端中使用產生的 WCF 服務。在用戶端視窗中按下 ENTER 鍵,即可關閉用戶端。

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

若要設定和建置範例

  1. 請確定您已執行 Windows Communication Foundation 範例的單次安裝程序

  2. 若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。

  3. 確定 \InetPub\wwwroot\ServiceModelSamples 及其 bin 子目錄都是空的。

  4. 從命令提示字元巡覽至範例的 service\bin 資料夾。如果使用 Windows Vista 或 Windows Server 2008,請務必使用系統管理員身分執行命令提示字元。

  5. 輸入 gacutil.exe /i ESCalculator.dll,將組件新增至全域組件快取。請確定 Gacutil.exe 位於路徑中。

  6. 輸入 regsvcs.exe ESCalculator.dll,向 COM+ 註冊組件的元件和 ServiceModelSample 應用程式。請確定 Regsvcs.exe 位於路徑中。

  7. 輸入 ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose,將介面公開為裝載於 IIS 的服務。

    請確定 ComSvcConfig.exe 位於路徑中。

若要在同一部機器上執行範例

  1. 輸入下列位址,確定您可以使用瀏覽器存取服務:https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc。確認頁面應該會顯示在回應中。

  2. 從語言特定資料夾下的 \client\bin\ 執行 Client.exe。用戶端活動會顯示在用戶端主控台視窗上。

  3. 如果用戶端和服務無法通訊,請參閱疑難排解秘訣

    ms751523.note(zh-tw,VS.90).gif注意:
    這個範例會建置主控台應用程式用戶端程式。您必須使用命令提示字元加以啟動,才會看到範例的輸出。

若要跨機器執行範例

  1. 在服務機器上,建立一個名稱為 ServiceModelSamples 的虛擬目錄。您可以使用虛擬目錄安裝指示隨附的 Setupvroot.bat 指令碼,建立磁碟目錄和虛擬目錄。

  2. 將 service\bin 目錄中的 ESCalculator.dll 檔案複製到服務機器上的目錄。

  3. 從命令提示字元巡覽至服務機器上的這個目的目錄。如果使用 Windows Vista 或 Windows Server 2008,請務必使用系統管理員身分執行命令提示字元。

  4. 在服務機器上,輸入 gacutil.exe /i ESCalculator.dll,將組件新增至全域組件快取。

  5. 在服務機器上,輸入 regsvcs.exe ESCalculator.dll,向 COM+ 註冊組件的元件和 ServiceModelSample 應用程式。

  6. 在服務機器上,輸入 ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose,將合約公開為裝載於 IIS 的服務。

  7. 將語言特定資料夾下 \client\bin\ 資料夾中的用戶端程式檔案複製到用戶端機器中。

  8. 在用戶端組態檔中,變更端點定義的位址值以符合服務的新位址。以位址中的完整網域名稱取代 "localhost" 的任何參考。

  9. 確定您可以使用瀏覽器,從用戶端機器存取服務。

  10. 在用戶端機器上,從命令提示字元啟動 Client.exe。

若要在使用範例之後進行清除

  1. 如果使用 Windows Vista 或 Windows Server 2008,請務必使用系統管理員身分執行命令提示字元。輸入 ComSvcConfig.exe /u /application:ServiceModelSample /contract:ServiceModelSample.ESCalculator,ICalculator,將 COM+ 整合解除安裝。

  2. 輸入 regsvcs.exe /u ESCalculator.dll,從 COM+ 解除安裝應用程式。

  3. 輸入 gacutil.exe /u ESCalculator,從全域組件快取移除元件。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.