持久性服务

此示例演示如何通过将计算器作为持久性服务实现来创建持久性服务。因为服务在每次调用后都是持久性的,所以将保存服务的状态。如果服务进行回收,其状态可以还原到最近的持久性点,因此需要一项持久性服务。

提示

此示例需要安装 .NET Framework 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 属性指定当在其上指定该属性的操作完成后,实例才完成。操作完成后,状态也即从数据库中删除。

下面的代码演示在 Internet 信息服务 (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”** 以打开 Internet 信息服务 (IIS) MMC 管理单元。
    2. 右击**“默认网站”内的虚拟根目录“ServiceModelSamples”,单击“属性”,然后单击“目录安全性”**选项卡。
    3. 在**“身份验证和访问控制”之下,单击“编辑”**。
    4. 在**“身份验证方法”对话框中,选择“集成 Windows 身份验证”**。

    在 IIS 7.0 中启用 Windows 身份验证:

    1. 打开一个命令提示符窗口,并键入**“start inetmgr”** 以打开 Internet 信息服务 (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. 若要测试服务的持久性本质,请在计算器客户端正在运行时关闭客户端并重新打开客户端。计算器客户端会重新与同一个服务实例进行通信,并在底部显示实例 ID。在进行第一次调用时,计算器客户端使用名为 Client.ctx 的文本文件将上下文存储在一个持久位置(在本例中,存储在示例的 \bin 目录中)。重新打开客户端时,此客户端将检查文件是否存在。如果文件存在,则客户端会将存储的上下文应用于要创建的通道。如果持久性服务已经完成并且您打开了此客户端,而 Client.ctx 文件仍在您的 \bin 目录中,则它将尝试向通道应用上下文。您将收到错误,因为不存在要与其进行通信的持久性服务实例。请删除文件并重试。

  8. 还可以通过重新启动 IIS 回收持久性服务。因为在每次操作之后都要使用持久性存储区,所以服务的状态为“已存储”。因此,当您尝试在重新启动 IIS 后从客户端与该服务进行通信时,基础结构将从持久性存储区收到持久性服务实例,而您可以与同一个实例进行通信。

    提示

    在重新启动 IIS 之后首次调用一个操作时,您将收到 MessageSecurityException 异常,这是由通道上过期的安全令牌引起的。如果调用另一项操作,则此操作将会成功。

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