Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo de volátil demonstra como realizar a comunicação em fila volátil no transporte do Enfileiramento de Mensagens (MSMQ). Este exemplo usa NetMsmqBinding. Neste caso, o serviço é um aplicativo de console auto-hospedado para permitir que você observe o serviço que está recebendo mensagens na fila.
Observação
O procedimento de instalação e as instruções de build para este exemplo estão localizados no final deste tópico.
Na comunicação na fila, o cliente se comunica com o serviço usando uma fila. Mais precisamente, o cliente envia mensagens para uma fila. O serviço recebe mensagens da fila. Portanto, o serviço e o cliente não precisam estar em execução ao mesmo tempo para se comunicar usando uma fila.
Quando você envia uma mensagem sem garantias, o MSMQ só faz um melhor esforço para entregar a mensagem, ao contrário das garantias exatamente uma vez em que o MSMQ garante que a mensagem seja entregue ou, se não puder ser entregue, permitirá que você saiba que a mensagem não pode ser entregue.
Em determinados cenários, talvez você queira enviar uma mensagem volátil sem garantias sobre uma fila, quando a entrega oportuna é mais importante do que perder mensagens. Mensagens voláteis não sobrevivem a falhas do gerenciador de filas. Portanto, se o gerenciador de filas falhar, a fila não transacional usada para armazenar mensagens voláteis sobreviverá, mas as mensagens em si não o farão porque as mensagens não são armazenadas no disco.
Observação
Você não pode enviar mensagens voláteis sem garantias no escopo de uma transação usando o MSMQ. Você também deve criar uma fila não transacional para enviar mensagens voláteis.
O contrato de serviço nesse exemplo é IStockTicker, que define serviços unidirecionais mais adequados para uso com enfileiramento.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void StockTick(string symbol, float price);
}
A operação de serviço exibe o símbolo e o preço do ticker de ações, conforme mostrado no seguinte código de exemplo:
public class StockTickerService : IStockTicker
{
public void StockTick(string symbol, float price)
{
Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
}
…
}
O serviço é autogerenciado. Ao usar o transporte MSMQ, a fila usada deve ser criada com antecedência. Isso pode ser feito manualmente ou por meio do código. Neste exemplo, o serviço contém código para verificar a existência da fila e criá-la, se necessário. O nome da fila é lido do arquivo de configuração. O endereço base é usado pela ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar o proxy para o serviço.
// Host the service within this EXE console application.
public static void Main()
{
// Get MSMQ queue name from app settings in configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the transacted MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName);
// Create a ServiceHost for the StockTickerService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(StockTickerService)))
{
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHost to shutdown the service.
serviceHost.Close();
}
}
O nome da fila MSMQ é especificado na seção appSettings do arquivo de configuração. O ponto de extremidade do serviço é definido na seção system.serviceModel do arquivo de configuração e especifica a associação netMsmqBinding.
Observação
O nome da fila usa um ponto (.) para o computador local e separadores de barra invertida no caminho ao criar uma fila usando System.Messaging. O endereço de ponto de extremidade do WCF (Windows Communication Foundation) especifica um esquema net.msmq:, usa "localhost" para o computador local e barras no caminho.
As garantias e a durabilidade ou a volatilidade das mensagens também são especificadas na configuração.
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="queueName" value=".\private$\ServiceModelSamplesVolatile" />
</appSettings>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.StockTickerService"
behaviorConfiguration="CalculatorServiceBehavior">
...
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
binding="netMsmqBinding"
bindingConfiguration="volatileBinding"
contract="Microsoft.ServiceModel.Samples.IStockTicker" />
...
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="volatileBinding"
durable="false"
exactlyOnce="false"/>
</netMsmqBinding>
</bindings>
...
</system.serviceModel>
Como o exemplo envia mensagens enfileiradas usando uma fila não transacional, as mensagens transacionadas não podem ser enviadas para a fila.
// Create a client.
Random r = new Random(137);
StockTickerClient client = new StockTickerClient();
float price = 43.23F;
for (int i = 0; i < 10; i++)
{
float increment = 0.01f * (r.Next(10));
client.StockTick("zzz" + i, price + increment);
}
//Closing the client gracefully cleans up resources.
client.Close();
Quando você executa o exemplo, as atividades de cliente e serviço são exibidas nas janelas do serviço e do console do cliente. Você pode ver o serviço receber mensagens do cliente. Pressione ENTER em cada janela do console para desligar o serviço e o cliente. Observe que, como o sistema de filas está em uso, o cliente e o serviço não precisam estar funcionando ao mesmo tempo. Você pode executar o cliente, desligá-lo e, em seguida, iniciar o serviço e ele ainda recebe suas mensagens.
The service is ready.
Press <ENTER> to terminate service.
Stock Tick zzz0:43.25
Stock Tick zzz1:43.23
Stock Tick zzz2:43.28
Stock Tick zzz3:43.3
Stock Tick zzz4:43.23
Stock Tick zzz5:43.25
Stock Tick zzz6:43.25
Stock Tick zzz7:43.24
Stock Tick zzz8:43.32
Stock Tick zzz9:43.3
Para configurar, compilar e executar o exemplo
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.
Para executar o exemplo em uma configuração única ou entre máquinas, siga as instruções em Executando os exemplos do Windows Communication Foundation.
Por padrão, com o NetMsmqBinding, a segurança de transporte está habilitada. Há duas propriedades pertinentes para a segurança do transporte MSMQ, MsmqAuthenticationMode e MsmqProtectionLevel.. Por padrão, o modo de autenticação é definido como Windows e o nível de proteção é definido como Sign. Para que o MSMQ forneça o recurso de autenticação e assinatura, ele deve fazer parte de um domínio e a opção de integração do Active Directory para MSMQ deve ser instalada. Se você executar este exemplo em um computador que não atenda a esses critérios, você receberá um erro.
Para executar o exemplo em um computador ingressado em um grupo de trabalho ou sem integração com o Active Directory
Se o computador não fizer parte de um domínio ou não tiver a integração do Active Directory instalada, desative a segurança de transporte definindo o modo de autenticação e o nível de proteção como
Nonemostrado no seguinte código de configuração de exemplo:<system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.StockTickerService" behaviorConfiguration="StockTickerServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <!-- Define NetMsmqEndpoint --> <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile" binding="netMsmqBinding" bindingConfiguration="volatileBinding" contract="Microsoft.ServiceModel.Samples.IStockTicker" /> <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <netMsmqBinding> <binding name="volatileBinding" durable="false" exactlyOnce="false"> <security mode="None" /> </binding> </netMsmqBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="StockTickerServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>Verifique se você alterou a configuração no servidor e no cliente antes de executar o exemplo.
Observação
A configuração de
security modeparaNoneé equivalente a configurar a segurança de MsmqAuthenticationMode, MsmqProtectionLevel eMessageparaNone.