Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’exemple Volatile montre comment effectuer une communication volatile en file d’attente via le transport MSMQ (Message Queuing). Cet exemple utilise NetMsmqBinding. Le service dans ce cas est une application console auto-hébergée pour vous permettre d’observer le service recevant des messages mis en file d’attente.
Remarque
La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.
Dans la communication en file d'attente, le client communique avec le service à l’aide d’une file d’attente. Plus précisément, le client envoie des messages à une file d’attente. Le service reçoit des messages de la file d’attente. Le service et le client n'ont donc pas besoin d'être en cours d’exécution simultanément pour communiquer via une file d’attente.
Lorsque vous envoyez un message sans garantie, MSMQ ne fait qu’un meilleur effort pour remettre le message, contrairement aux assurances Exactement une fois où MSMQ garantit que le message est remis ou, s’il ne peut pas être remis, vous indique que le message ne peut pas être remis.
Dans certains scénarios, vous souhaiterez peut-être envoyer un message volatile sans garantie sur une file d’attente, lorsque la remise en temps voulu est plus importante que la perte de messages. Les messages volatiles ne survivent pas aux blocages du gestionnaire de files d’attente. Par conséquent, si le gestionnaire de files d’attente se bloque, la file d’attente non transactionnelle utilisée pour stocker les messages volatiles survive, mais les messages eux-mêmes ne sont pas stockés sur le disque.
Remarque
Vous ne pouvez pas envoyer de messages volatils sans garantie dans le cadre d'une transaction en utilisant MSMQ. Vous devez également créer une file d’attente non transactionnelle pour envoyer des messages volatiles.
Le contrat de service dans cet exemple est IStockTicker, celui qui définit des services unidirectionnels qui conviennent le mieux à une utilisation avec la mise en file d'attente.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void StockTick(string symbol, float price);
}
L’opération de service affiche le symbole et le prix du ticker boursier, comme indiqué dans l’exemple de code suivant :
public class StockTickerService : IStockTicker
{
public void StockTick(string symbol, float price)
{
Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
}
…
}
Le service est auto-hébergé. Lorsque vous utilisez le transport MSMQ, la file d’attente utilisée doit être créée à l’avance. Cette opération peut être effectuée manuellement ou via du code. Dans cet exemple, le service contient du code pour vérifier l’existence de la file d’attente et le créer si nécessaire. Le nom de la file d’attente est lu à partir du fichier de configuration. L’adresse de base est utilisée par l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe) pour générer le proxy pour le service.
// 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();
}
}
Le nom de la file d’attente MSMQ est spécifié dans la section appSettings du fichier de configuration. Le point de terminaison du service est défini dans la section system.serviceModel du fichier de configuration et spécifie la netMsmqBinding liaison.
Remarque
Le nom de la file d’attente comprend un point (.) pour l’ordinateur local et des barre obliques inverses dans son chemin d’accès lors de la création d’une file d’attente à l’aide de System.Messaging. L’adresse du point de terminaison WCF (Windows Communication Foundation) spécifie un modèle net.msmq: et utilise « localhost » pour l’ordinateur local et des barres obliques dans son chemin.
Les garanties et la durabilité ou la volatilité des messages sont également spécifiées dans la configuration.
<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>
Étant donné que l’exemple envoie des messages mis en file d’attente à l’aide d’une file d’attente non transactionnelle, les messages traités ne peuvent pas être envoyés à la file d’attente.
// 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();
Lorsque vous exécutez l’exemple, les activités du client et du service s’affichent dans les fenêtres de la console du service et du client. Vous pouvez voir le service recevoir des messages du client. Appuyez sur Entrée dans chaque fenêtre de console pour arrêter le service et le client. Notez que, étant donné que la mise en file d’attente est en cours d’utilisation, le client et le service n’ont pas besoin d’être opérationnel en même temps. Vous pouvez exécuter le client, l'arrêter, puis démarrer le service, et il continuera à recevoir ses messages.
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
Pour configurer, générer et exécuter l’exemple
Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.
Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.
Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.
Par défaut, la sécurité de transport est activée avec le NetMsmqBinding. Il existe deux propriétés pertinentes pour la sécurité du transport MSMQ, MsmqAuthenticationMode et MsmqProtectionLevel.. Par défaut, le mode d'authentification est défini sur Windows et le niveau de protection est défini sur Sign. Pour que MSMQ fournisse la fonctionnalité d’authentification et de signature, elle doit faire partie d’un domaine et l’option d’intégration Active Directory pour MSMQ doit être installée. Si vous exécutez cet exemple sur un ordinateur qui ne répond pas à ces critères, vous recevez une erreur.
Pour exécuter l’exemple sur un ordinateur joint à un groupe de travail ou sans intégration Active Directory
Si votre ordinateur ne fait pas partie d’un domaine ou n’a pas d’intégration Active Directory installée, désactivez la sécurité du transport en définissant le mode d’authentification et le niveau
Nonede protection comme indiqué dans l’exemple de code de configuration suivant :<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>Veillez à modifier la configuration sur le serveur et le client avant d’exécuter l’exemple.
Remarque
Régler
security modesurNoneéquivaut à régler MsmqAuthenticationMode, MsmqProtectionLevel etMessagesur le niveau de sécuritéNone.