Instanciação
O exemplo de instanciação demonstra a configuração de comportamento de instanciação, que controla como as instâncias de uma classe de serviço são criadas em resposta às solicitações do cliente. O exemplo é baseado na Introdução, que implementa o ICalculator
contrato de serviço. Este exemplo define um novo contrato, ICalculatorInstance
, que herda de ICalculator
. O contrato especificado por ICalculatorInstance
fornece três operações adicionais para inspecionar o estado da instância de serviço. Ao alterar a configuração de instanciação, você pode observar a mudança de comportamento executando o cliente.
Neste exemplo, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelo IIS (Serviços de Informações da Internet).
Nota
O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.
Os seguintes modos de instanciação estão disponíveis:
PerCall: Uma nova instância de serviço é criada para cada solicitação do cliente.
PerSession: Uma nova instância é criada para cada nova sessão de cliente e mantida durante o tempo de vida dessa sessão (requer uma associação que ofereça suporte à sessão).
Single: Uma única instância da classe de serviço lida com todas as solicitações de cliente durante o tempo de vida do aplicativo.
A classe service especifica o comportamento de instanciação com o [ServiceBehavior(InstanceContextMode=<setting>)]
atributo conforme mostrado no exemplo de código a seguir. Ao alterar quais linhas são comentadas, você pode observar o comportamento de cada um dos modos de instância. Lembre-se de reconstruir o serviço depois de alterar o modo de instanciação. Não há configurações relacionadas à instância para especificar no cliente.
// 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();
}
Quando você executa o exemplo, as solicitações de operação e as respostas são exibidas na janela do console do cliente. O modo de instância em que o serviço está sendo executado é exibido. Após cada operação, o ID da instância e a contagem da operação são exibidos para refletir o comportamento do modo de instanciação. Pressione ENTER na janela do cliente para desligar o cliente.
Para configurar, compilar e executar o exemplo
Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.
Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.
Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.