实例化
“实例化”示例演示实例化行为设置,此设置控制如何响应客户端请求来创建服务类的实例。此示例基于实现 ICalculator
服务协定的入门示例。本示例定义从 ICalculator
继承的新协定 ICalculatorInstance
。用 ICalculatorInstance
指定的协定提供了三个附加操作,用于检查服务实例的状态。通过更改实例化设置,运行客户端时可以观察到行为中的更改。
在此示例中,客户端是一个控制台应用程序 (.exe),服务是由 Internet 信息服务 (IIS) 承载的。
提示
本主题的最后介绍了此示例的设置过程和生成说明。
可以使用下列实例化模式:
- PerCall:为每个客户端请求创建一个新的服务实例。
- PerSession:为每个新的客户端会话创建一个新的实例,并在该会话的生存期内对其进行维护(这需要能够支持会话的绑定)。
- Single:服务类的单个实例处理应用程序生存期内的所有客户端请求。
服务类使用以下代码示例中显示的 [ServiceBehavior(InstanceContextMode=<setting>)]
属性来指定实例化行为。通过更改注释掉的行,可以观察每个实例模式的行为。更改实例化模式之后要记着重新生成服务。没有要在客户端上指定的实例化相关设置。
// Enable one of the following instance modes to compare instancing behaviors.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
// PerCall creates a new instance for each operation.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
// Singleton creates a single instance for application lifetime.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorInstance
{
static Object syncObject = new object();
static int instanceCount;
int instanceId;
int operationCount;
public CalculatorService()
{
lock (syncObject)
{
instanceCount++;
instanceId = instanceCount;
}
}
public double Add(double n1, double n2)
{
operationCount++;
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 * n2;
}
public double Divide(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 / n2;
}
public string GetInstanceContextMode()
{ // Return the InstanceContextMode of the service
ServiceHost host = (ServiceHost)OperationContext.Current.Host;
ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
return behavior.InstanceContextMode.ToString();
}
public int GetInstanceId()
{ // Return the id for this instance
return instanceId;
}
public int GetOperationCount()
{ // Return the number of ICalculator operations performed
// on this instance
lock (syncObject)
{
return operationCount;
}
}
}
static void Main()
{
// Create a client.
CalculatorInstanceClient client = new CalculatorInstanceClient();
string instanceMode = client.GetInstanceContextMode();
Console.WriteLine("InstanceContextMode: {0}", instanceMode);
DoCalculations(client);
// Create a second client.
CalculatorInstanceClient client2 = new CalculatorInstanceClient();
DoCalculations(client2);
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
}
运行示例时,操作请求和响应将显示在客户端控制台窗口中。会显示运行服务时所使用的实例模式。执行每个操作后,显示实例 ID 和操作计数以反映实例化模式的行为。在客户端窗口中按 Enter 可以关闭客户端。
设置、生成和运行示例
若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
若要用单机配置或跨计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.