Share via


長期服務

這個範例會示範如何實作計算機做為長期服務,以建立長期服務。由於此服務在每次呼叫之後都是長期的,因此會儲存此服務的狀態。如果服務回收,其狀態可以還原成最近的持續點,因此需要持續性服務。

Bb410767.note(zh-tw,VS.90).gif注意:
要建置和執行這個範例,必須安裝 .NET Framework version 3.5。要開啟專案和方案檔,必須要有 Visual Studio 2008。

如需 設定這個範例的詳細資訊,請參閱 Windows Communication Foundation 範例的單次安裝程序。您必須使用這個服務來執行計算機用戶端。如需詳細資訊,請參閱 本主題尾端的安裝程序。

下列程式碼會顯示計算機服務的服務合約。

[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
    public interface ICalculator
    {
        [OperationContract()]
        int PowerOn();
        [OperationContract()]
        int Add(int value);
        [OperationContract()]
        int Subtract(int value);
        [OperationContract()]
        int Multiply(int value);
        [OperationContract()]
        int Divide(int value);
        [OperationContract()]
        void PowerOff();
    }  

在下列程式碼中,DurableServiceAttribute 屬性會用於服務實作中,以指定其為長期服務。

[Serializable]
[DurableServiceBehavior]
public class DurableCalculator : ICalculator
{
    int currentValue = default(int);

    [DurableOperationBehavior(CanCreateInstance=true)]
    public int PowerOn()
    {
        return currentValue;
    }

    [DurableOperationBehavior()]
    public int Add(int value)
    {
        return (currentValue += value);
    }

    [DurableOperationBehavior()]
    public int Subtract(int value)
    {
        return (currentValue -= value);
    }

    [DurableOperationBehavior()]
    public int Multiply(int value)
    {
        return (currentValue *= value);
    }

    [DurableOperationBehavior()]
    public int Divide(int value)
    {
        return (currentValue /= value);
    }

    [DurableOperationBehavior(CompletesInstance=true)]
    public void PowerOff()
    {
    }

}

DurableOperationAttribute 屬性會指定在作業完成之後儲存執行個體狀態。

DurableOperationAttribute 屬性上有兩個欄位可以指定。

CanCreateInstance 屬性會指定在叫用作業時建立執行個體。為使 CanCreateInsatance 正常運作,它在其上指定的作業必須是要求/回應作業。在這個範例中,內容會傳播至用戶端,而用戶端與服務通訊的功能可達到長期性。如果作業是單向的,內容便不會傳播至用戶端,因此如果要與服務執行個體進行長時間執行且長期的對話,必須有另一種方法可將內容傳遞至用戶端。

CompletesInstance 屬性會指定在所指定的作業完成之後完成執行個體。在作業完成之後,也會從資料庫刪除狀態。

下列程式碼示範用來在網際網路資訊服務 (IIS) 中裝載這個範例的 .svc 檔案。

<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

服務的繫結是在 Web.config 檔案中設定的。會公開具有不同繫結的兩個端點:已啟用 Cookie 的 BasicHttpContextBinding 和不想使用 BasicHttpContextBinding 的用戶端的 WSHttpContextBindingWSHttpContextBinding 繫結對維護用來將要求路由至特定長期服務執行個體的內容有幫助。指定持續性提供者的 PersistenceProvider 項目位於 ServiceBehaviors 區段中。

若要設定及執行服務

  1. 若要使用指令碼來正確設定這個範例,請參閱 Windows Communication Foundation 範例的單次安裝程序

  2. 在 IIS 中,啟用 ServiceModelSamples 虛擬目錄上的 Windows 驗證。

    若要在 IIS 5.1 或 6.0 中啟用 Windows 驗證:

    1. 開啟 [命令提示字元] 視窗,輸入 start inetmgr 以開啟網際網路資訊服務 (IIS) MMC 嵌入式管理單元。
    2. 以滑鼠右鍵按一下 [預設的網站] 中的虛擬根目錄 [ServiceModelSamples],再按一下 [屬性],然後按一下 [目錄安全性] 索引標籤。
    3. 按一下 [驗證及存取控制] 之下的 [編輯]。
    4. 選取 [驗證方法] 對話方塊中的 [整合式 Windows 驗證]。

    若要在 IIS 7.0 中啟用 Windows 驗證:

    1. 開啟 [命令提示字元] 視窗,輸入 start inetmgr 以開啟網際網路資訊服務 (IIS) MMC 嵌入式管理單元。
    2. 選取 [預設的網站] 中的 [ServiceModelSamples] 虛擬根目錄。
    3. 在 [ServiceModelSamples] 主窗格中,按兩下 [IIS] 群組中的 [驗證]。
    4. 選取 [Windows 驗證] 並選取 [啟用] 動作。
  3. 建置專案。專案會建置和更新 ServiceModelSamples。

  4. 若要允許存取長期存放區:

    1. 執行位於 Windows Communication Foundation 範例的單次安裝程序主題中的 CreateStores.cmd 指令碼。這個範例會使用 NetFx35Samples_DurableServiceStore 資料庫。
    2. 將 ASP.NET 使用者帳戶設定為 SQL Server 使用者群組成員。
  5. 若要確定已正確安裝服務,請指向 https://localhost/ServiceModelSamples/service.svc 這個位址。您應該會看到服務的說明網頁。若要檢視 Web 服務描述語言 (WSDL),請輸入 https://localhost/ServiceModelSamples/service.svc?wsdl.

  6. 若要執行這個範例,您必須使用計算機用戶端範例。這是使用 Windows Presentation Foundation (WPF) 建立做為服務之用戶端的計算機使用者介面。您可以使用對應至服務所提供繫結的不同端點。若要變更繫結,請按一下 [端點] 功能表項目,然後選取適當的繫結,即 [BasicHttpContextBinding] 或 [WSHttpContextBinding]。

  7. 若要測試服務的長期性特質,請在計算機用戶端執行時關閉該用戶端,並再重新開啟。計算機用戶端會再與相同的服務執行個體通訊,並在底部顯示執行個體識別碼。計算機用戶端會使用名為 Client.ctx 的文字檔,來儲存在第一次發出呼叫時出現在長期位置的內容 (在此範例中,是在範例的 \bin 目錄中)。當您重新開啟用戶端時,它會檢查檔案是否存在。如果該檔案存在,它就會將儲存的內容套用至要建立的通道。如果長期服務已完成,而您開啟用戶端時 Client.ctx 檔案仍在 \bin 目錄中,它會嘗試將內容套用至通道。如果您要與其通訊的長期服務執行個體不存在,就會收到錯誤訊息。請刪除檔案然後再試一次。

  8. 您也可以重新啟動 IIS 以回收長期服務。因為您在每一個作業後都要使用持續性存放區,所以會儲存服務的狀態。因此,當您嘗試在重新啟動 IIS 之後從用戶端與服務通訊時,此基礎結構會接收來自持續性存放區的長期服務執行個體,這樣您就可以與相同的執行個體進行通訊。

    Bb410767.note(zh-tw,VS.90).gif注意:
    當您重新啟動 IIS 後初次叫用作業時,會收到 MessageSecurityException 例外狀況,這是通道上已過期的安全性權杖所造成的。叫用其他作業就會成功。

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