任务 2:为持久性服务启用持久性

在此任务中,将使用一些属性来修饰在任务 1 中创建的服务,这些属性使您在每次成功进行操作调用后能够保存服务的状态。

使用持久性服务属性修饰服务

  1. 打开 Service1.cs(如果创建了 Visual Basic 解决方案,则打开 Service1.vb)。

  2. 在**“解决方案资源管理器”窗格中的“SimpleDurableService”项目节点下,右击“引用”子文件夹,然后选择“添加引用”**。

  3. 在**“添加引用”对话框中的“.NET”选项卡下,选择“System.WorkflowServices”,然后单击“确定”**。

  4. 在 C# 源文件中添加下面的 using 语句:

如果已创建 Visual Basic 解决方案,请右击 SimpleDurableService 项目节点并选择**“属性”。选择“引用”选项卡,然后在“导入的命名空间”下选中“System.ServiceModel.Description”**。

  1. 若要保留服务,必须使用 DurableServiceAttributeSerializableAttribute 属性来修饰 Service1 类,如下面的示例所示。

  2. DurableServiceAttribute 属性指定 WCF 服务的状态信息可以保存到持久性存储区,如数据库或文件。另外,服务类型必须是可序列化的,以便可以将其传输到持久性存储区中。

  3. 使用 DurableOperationAttribute 属性修饰服务操作,如下面的示例所示。此属性指定将在操作完成后保存服务实例状态。

CanCreateInstanceCompletesInstance 属性指定在修饰操作成功完成之后要么创建要么完成持久性服务实例。在本教程中,几个操作中的第一个和最后一个操作控制服务实例的行为。

用设置为默认值的 DurableOperationAttribute 属性装饰的操作只可将状态信息保存到持久性存储区中的现有服务实例项中。但如果创建了一个 System.ServiceModel.SessionMode.NotAllowed 设置为 true 的服务协定,则每个 DurableOperationAttribute 属性 (Attribute) 必须使 CanCreateInstance 属性 (Property) 设置为 true

由于您的服务已使用适当的属性进行修饰,因此必须设置配置文件并引用希望使用的持久性存储区。

配置持久性服务

  1. 打开 App.config。

  2. 修改终结点配置设置以引用上下文绑定,如 WSHttpContextBinding

    <endpoint address ="" binding="wsHttpContextBinding" contract="SimpleDurableService.IService1" />
    

    由于客户端使用 DurableOperationContext 来标识特定服务实例,因此必须使用上下文绑定。调用请求/响应操作并从服务接收响应后,客户端将对每个后续的操作调用使用 InstanceId 值,以便客户端将自身与正确的服务实例相关联。如果未使用此跟踪机制,则在关闭服务实例时或将其与客户端断开连接时,客户端将不能重新建立与特定服务实例的连接。

  3. 将下列子节点添加到行为节点中。

    <behaviors>
          <serviceBehaviors>
            <behavior name="SimpleDurableService.Service1Behavior">
              <!-- To avoid disclosing metadata information, 
              set the following value to false and remove the preceding metadata endpoint before deployment. -->
              <serviceMetadata httpGetEnabled="True"/>
              <!-- To receive exception details in faults for debugging purposes, 
              set the following value to true. Set the value to false before deployment 
              to avoid disclosing exception information. -->
              <serviceDebug includeExceptionDetailInFaults="False" />
              <persistenceProvider type="System.ServiceModel.Persistence.SqlPersistenceProviderFactory, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                                   connectionStringName="DurableServiceStore" 
                                   persistenceOperationTimeout = "00:00:10"
                                   lockTimeout="00:01:00"
                                   serializeAsText="true"/>
    
            </behavior>
          </serviceBehaviors>
        </behaviors>
    

    PersistenceProviderElement 定义服务将使用的 PersistenceProvider 的类型。在本教程中,SqlPersistenceProviderFactory 用于创建连接到 SQL 数据库的 PersistenceProvider 类型的新实例。每当调用 Add 操作并成功完成时,都将创建一个新的服务实例,并且将它的状态信息存储在 SQL 数据库中。

  4. 添加 SQL 数据库的连接字符串,服务实例将使用该数据库获得持久性。

      </system.serviceModel>
      <connectionStrings>
        <add name="DurableServiceStore" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=NetFx35Samples_DurableServiceStore;Integrated Security=SSPI"/>
      </connectionStrings>
    </configuration>
    

提示

本教程使用的数据库是用于Durable Workflow Services Sample的同一数据库;因此,连接字符串也是一样的。若要允许访问持久性存储区,请运行 One-Time Setup Procedure for the Windows Communication Foundation Samples中的 Createstores.cmd 脚本。

在下一个任务中,将创建一个可以访问持久性服务的客户端。

另请参见

任务

任务 1:定义和实现持久性服务协定
任务 3:创建持久性服务客户端

其他资源

教程:创建持久性服务

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。