Delen via


Vluchtige communicatie in wachtrij

Het vluchtige voorbeeld laat zien hoe u vluchtige communicatie in de wachtrij uitvoert via het MSMQ-transport (Message Queuing). In dit voorbeeld wordt gebruikgemaakt van NetMsmqBinding. De service in dit geval is een zelf-hostende consoletoepassing waarmee u de service die berichten in de wachtrij ontvangt, kunt observeren.

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

Bij communicatie in de wachtrij communiceert de client met de service via een wachtrij. De client verzendt precies berichten naar een wachtrij. De service ontvangt berichten uit de wachtrij. De service en client hoeven daarom niet tegelijkertijd te worden uitgevoerd om te communiceren met behulp van een wachtrij.

Wanneer u een bericht zonder garanties verzendt, doet MSMQ alleen een best effort om het bericht af te leveren, in tegenstelling tot met Exactly Once-garanties waarbij MSMQ ervoor zorgt dat het bericht wordt bezorgd of, als het niet kan worden bezorgd, laat u weten dat het bericht niet kan worden bezorgd.

In bepaalde scenario's wilt u mogelijk een vluchtig bericht zonder garanties over een wachtrij verzenden, wanneer tijdige bezorging belangrijker is dan het verliezen van berichten. Vluchtige berichten overleven het vastlopen van wachtrijbeheer niet. Als de wachtrijbeheerder vastloopt, blijft de niet-transactionele wachtrij die wordt gebruikt voor het opslaan van vluchtige berichten, maar de berichten zelf niet omdat de berichten niet op de schijf worden opgeslagen.

Notitie

U kunt geen vluchtige berichten verzenden zonder garanties binnen het bereik van een transactie met MSMQ. U moet ook een niet-transactionele wachtrij maken om vluchtige berichten te verzenden.

Het servicecontract in dit voorbeeld is IStockTicker dat services in één richting definieert die het meest geschikt zijn voor gebruik met wachtrijen.

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
    [OperationContract(IsOneWay = true)]
    void StockTick(string symbol, float price);
}

In de servicebewerking worden het symbool en de prijs van de aandelen ticker weergegeven, zoals wordt weergegeven in de volgende voorbeeldcode:

public class StockTickerService : IStockTicker
{
    public void StockTick(string symbol, float price)
    {
        Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
     }
     …
}

De service wordt zelf gehost. Wanneer u het MSMQ-transport gebruikt, moet de gebruikte wachtrij vooraf worden gemaakt. Dit kan handmatig of via code. In dit voorbeeld bevat de service code om te controleren of de wachtrij bestaat en deze indien nodig te maken. De naam van de wachtrij wordt gelezen uit het configuratiebestand. Het basisadres wordt gebruikt door het Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) om de proxy voor de service te genereren.

// 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();
    }
}

De naam van de MSMQ-wachtrij wordt opgegeven in de app Instellingen sectie van het configuratiebestand. Het eindpunt voor de service wordt gedefinieerd in de sectie system.serviceModel van het configuratiebestand en geeft de netMsmqBinding binding op.

Notitie

De wachtrijnaam gebruikt een punt (.) voor de lokale computer en backslashscheidingstekens in het pad bij het maken van een wachtrij met behulp van System.Messaging. Het WCF-eindpuntadres (Windows Communication Foundation) specificeert een net.msmq:-schema, gebruikt 'localhost' voor de lokale computer en slashes in het pad.

De garanties en duurzaamheid of volatiliteit van berichten worden ook opgegeven in de configuratie.

<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>

Omdat het voorbeeld berichten in de wachtrij verzendt met behulp van een niet-transactionele wachtrij, kunnen verzonden berichten niet naar de wachtrij worden verzonden.

// 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();

Wanneer u het voorbeeld uitvoert, worden de client- en serviceactiviteiten weergegeven in zowel de service- als clientconsolevensters. U ziet dat de service berichten van de client ontvangt. Druk in elk consolevenster op Enter om de service en client af te sluiten. Houd er rekening mee dat omdat wachtrijen in gebruik zijn, de client en service niet tegelijkertijd actief hoeven te zijn. U kunt de client uitvoeren, de client afsluiten en vervolgens de service starten en de berichten nog steeds ontvangen.

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

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

NetMsmqBindingStandaard is transportbeveiliging ingeschakeld. Er zijn twee relevante eigenschappen voor MSMQ-transportbeveiliging. MsmqProtectionLevelMsmqAuthenticationMode. De verificatiemodus is standaard ingesteld op Windows en het beveiligingsniveau is ingesteld op .Sign MsMQ moet deel uitmaken van een domein en moet de active directory-integratieoptie voor MSMQ zijn geïnstalleerd om de verificatie- en ondertekeningsfunctie op te geven. Als u dit voorbeeld uitvoert op een computer die niet aan deze criteria voldoet, krijgt u een foutmelding.

Het voorbeeld uitvoeren op een computer die is gekoppeld aan een werkgroep of zonder Active Directory-integratie

  1. Als uw computer geen deel uitmaakt van een domein of geen Active Directory-integratie heeft geïnstalleerd, schakelt u transportbeveiliging uit door de verificatiemodus en het beveiligingsniveau in te None stellen op zoals wordt weergegeven in de volgende voorbeeldconfiguratiecode:

    <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>
    
  2. Zorg ervoor dat u de configuratie op zowel de server als de client wijzigt voordat u het voorbeeld uitvoert.

    Notitie

    Instelling security mode is None gelijk aan MsmqAuthenticationModeinstelling , MsmqProtectionLevelen Message beveiliging op None.