会话示例演示如何实现需要会话的协定。 会话提供执行多个操作的上下文。 这允许服务将状态与给定会话相关联,以便后续作可以使用上一作的状态。 此示例基于 入门,其中实现了计算器服务。
ICalculator
协定已修改,以允许执行一组算术运算,同时保留正在运行的结果。 此功能由 ICalculatorSession
协定定义。 服务在调用多个服务操作以执行一个计算时维护客户端的状态。 客户端可以通过调用 Result()
检索当前结果,并且可以通过调用 Clear()
将结果清除为零。
在此示例中,客户端是一个控制台应用程序 (.exe),服务是由 Internet 信息服务 (IIS) 承载的。
注释
本示例的设置过程和生成说明位于本主题末尾。
将合约的SessionMode设置为Required
,确保当合约通过特定绑定公开时,该绑定支持会话。 如果绑定不支持会话,则会引发异常。 定义 ICalculatorSession
接口,以便可以调用一个或多个作,从而修改正在运行的结果,如以下示例代码所示。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Result();
}
服务使用 InstanceContextMode 的 PerSession 将给定的服务实例上下文绑定到每个传入会话。 这允许服务维护本地成员变量中每个会话的运行结果。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorSession
{
double result = 0.0D;
public void Clear()
{ result = 0.0D; }
public void AddTo(double n)
{ result += n; }
public void SubtractFrom(double n)
{ result -= n; }
public void MultiplyBy(double n)
{ result *= n; }
public void DivideBy(double n)
{ result /= n; }
public double Result()
{ return result; }
}
运行示例时,客户端会向服务器发出多个请求并请求结果,然后在客户端控制台窗口中显示该请求。 在客户端窗口中按 Enter 关闭客户端。
(((0 + 100) - 50) * 17.65) / 2 = 441.25
Press <ENTER> to terminate client.
设置、生成和运行示例
确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。
若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。
若要在单台计算机或跨计算机配置中运行示例,请按照 运行 Windows Communication Foundation 示例中的说明进行操作。