Flüchtige Kommunikation unter Verwendung von WarteschlangenVolatile Queued Communication

In diesem Beispiel wird veranschaulicht, wie eine flüchtige Kommunikation unter Verwendung von Warteschlangen über Message Queuing (MSMQ)-Transport durchgeführt wird.This sample demonstrates how to perform volatile queued communication over the Message Queuing (MSMQ) transport. In diesem Beispiel wird NetMsmqBinding verwendet.This sample uses NetMsmqBinding. Der Dienst ist in diesem Fall eine selbst gehostete Konsolenanwendung, die es Ihnen ermöglicht, den Dienst beim Empfang von Nachrichten in der Warteschlange zu beobachten.The service in this case is a self-hosted console application to enable you to observe the service receiving queued messages.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

In einer Warteschlangenkommunikation kommuniziert der Client über eine Warteschlange mit dem Dienst.In queued communication, the client communicates to the service using a queue. Genauer ausgedrückt bedeutet dies, dass der Client Nachrichten an eine Warteschlange sendet.More precisely, the client sends messages to a queue. Der Dienst empfängt Nachrichten aus der Warteschlange.The service receives messages from the queue. Folglich müssen der Dienst und der Client nicht gleichzeitig ausgeführt werden, um über eine Warteschlange zu kommunizieren.The service and client therefore, do not have to be running at the same time to communicate using a queue.

Wenn Sie eine Nachricht ohne Zusicherungen senden, sendet MSMQ nur nach dem Best-Effort-Prinzip, im Gegensatz zu Exactly Once-Zusicherungen, bei denen MSMQ sicherstellt, dass die Nachricht zugestellt wird, oder Sie benachrichtigt werden, falls sie nicht zugestellt werden kann.When you send a message with no assurances, MSMQ only makes a best effort to deliver the message, unlike with Exactly Once assurances where MSMQ ensures that the message gets delivered or, if it cannot be delivered, lets you know that the message cannot be delivered.

In bestimmten Szenarios senden Sie eventuell eine flüchtige Nachricht ohne Zusicherungen über eine Warteschlange, wenn eine schnelle Zustellung wichtiger ist, als Nachrichten zu verlieren.In certain scenarios, you may want to send a volatile message with no assurances over a queue, when timely delivery is more important than losing messages. Flüchtige Nachrichten bleiben nach einem Absturz des Warteschlangen-Managers nicht erhalten.Volatile messages do not survive queue manager crashes. Wenn es daher zu einem Absturz des Warteschlangen-Managers kommt, bleibt die nicht transaktionale Warteschlange zum Speichern von flüchtigen Nachrichten erhalten, die Nachrichten selbst jedoch nicht, da sie nicht auf dem Datenträger gespeichert werden.Therefore if the queue manager crashes, the non-transactional queue used to store volatile messages survives but the messages themselves do not because the messages are not stored on the disk.

Hinweis

Sie können keine flüchtigen Nachrichten ohne Zusicherungen innerhalb des Bereichs einer Transaktion mit MSMQ senden.You cannot send volatile messages with no assurances within the scope of a transaction using MSMQ. Sie müssen außerdem eine nicht transaktionale Warteschlange erstellen, um flüchtige Nachrichten zu senden.You also must create a non-transactional queue to send volatile messages.

Bei dem Dienstvertrag in diesem Beispiel handelt es sich um IStockTicker. Hier werden unidirektionale Dienste definiert, die für die Verwendung mit Warteschlangen am besten geeignet sind.The service contract in this sample is IStockTicker that defines one-way services that are best suited for use with queuing.

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

Der Dienstvorgang zeigt das Aktientickersymbol und den Preis an, wie im folgenden Beispielcode dargestellt:The service operation displays the stock ticker symbol and price, as shown in the following sample code:

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

Der Dienst ist selbst gehostet.The service is self hosted. Bei Verwendung des MSMQ-Transports muss die Warteschlange im Voraus erstellt werden.When using the MSMQ transport, the queue used must be created in advance. Dies kann manuell erfolgen oder mithilfe eines Codes.This can be done manually or through code. In diesem Beispiel enthält der Dienst Code, um zu überprüfen, ob die Warteschlange bereits vorhanden ist, und um die Warteschlange gegebenenfalls zu erstellen.In this sample, the service contains code to check for the existence of the queue and create it if required. Der Warteschlangenname wird aus der Konfigurationsdatei gelesen.The queue name is read from the configuration file. Die Basisadresse wird verwendet, durch die ServiceModel Metadata Utility Tool (Svcutil.exe) auf den Proxy für den Dienst zu generieren.The base address is used by the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate the proxy for the 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();  
    }  
}  

Der MSMQ-Warteschlangenname wird im appSettings-Abschnitt der Konfigurationsdatei angegeben.The MSMQ queue name is specified in the appSettings section of the configuration file. Der Endpunkt für den Dienst wird im Abschnitt system.serviceModel der Konfigurationsdatei definiert und gibt die netMsmqBinding-Bindung an.The endpoint for the service is defined in the system.serviceModel section of the configuration file and specifies the netMsmqBinding binding.

Hinweis

Im Warteschlangennamen wird ein Punkt (.) für den lokalen Computer verwendet, und in der Pfadangabe werden umgekehrte Schrägstriche als Trennzeichen verwendet, wenn eine Warteschlange mithilfe von System.Messaging erstellt wird.The queue name uses a dot (.) for the local machine and backslash separators in its path when creating a queue using System.Messaging. Die Windows Communication Foundation (WCF)-Endpunktadresse gibt ein net.msmq:-Schema an und verwendet "Localhost" als lokalen Computer sowie Schrägstriche im Pfad.The Windows Communication Foundation (WCF) endpoint address specifies a net.msmq: scheme, uses "localhost" for the local machine and forward slashes in its path.

Die Zusicherungen und die Dauerhaftigkeit oder Flüchtigkeit von Nachrichten werden ebenfalls in der Konfiguration angegeben.The assurances and durability or volatility of messages are also specified in the 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>  

Da im Beispiel Nachrichten in der Warteschlange mithilfe einer nicht transaktionalen Warteschlange gesendet werden, können keine transaktiven Nachrichten an die Warteschlagen gesendet werden.Because the sample sends queued messages by using a non-transactional queue, transacted messages cannot be sent to the queue.

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

Wenn Sie das Beispiel ausführen, werden die Client- und Dienstaktivitäten sowohl im Dienst- als auch im Clientkonsolenfenster angezeigt.When you run the sample, the client and service activities are displayed in both the service and client console windows. Sie können sehen, wie der Dienst Nachrichten vom Client empfängt.You can see the service receive messages from the client. Drücken Sie die EINGABETASTE in den einzelnen Konsolenfenstern, um den Dienst und den Client zu schließen.Press ENTER in each console window to shut down the service and client. Beachten Sie, dass aufgrund der Verwendung einer Warteschlange der Client und der Dienst nicht gleichzeitig ausgeführt werden müssen.Note that because queuing is in use, the client and service do not have to be up and running at the same time. Sie können den Client ausführen, ihn schließen und anschließend den Dienst starten, der dann trotzdem noch die Nachrichten des Clients empfängt.You can run the client, shut it down, and then start up the service and it still receives its 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  

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Standardmäßig wird mit NetMsmqBinding die Transportsicherheit aktiviert.By default with the NetMsmqBinding, transport security is enabled. Es gibt zwei relevante Eigenschaften für die MSMQ-transportsicherheit MsmqAuthenticationMode und MsmqProtectionLevel . standardmäßig der Authentifizierungsmodus festgelegt ist, um Windows und die Schutzebene festgelegt ist, um Sign.There are two pertinent properties for MSMQ transport security, MsmqAuthenticationMode and MsmqProtectionLevel. By default, the authentication mode is set to Windows and the protection level is set to Sign. Damit MSMQ die Authentifizierungs- und Signierungsfunktion bereitstellt, muss es Teil einer Domäne sein, und die Active Directory-Integrationsoption für MSMQ muss installiert sein.For MSMQ to provide the authentication and signing feature, it must be part of a domain and the active directory integration option for MSMQ must be installed. Wenn Sie dieses Beispiel auf einem Computer ausführen, der diese Kriterien nicht erfüllt, tritt ein Fehler auf.If you run this sample on a computer that does not satisfy these criteria you receive an error.

So führen Sie das Beispiel auf einem Computer aus, der sich in einer Arbeitsgruppe befindet oder über keine Active Directory-Integration verfügtTo run the sample on a computer joined to a workgroup or without active directory integration

  1. Wenn Ihr Computer nicht zu einer Domäne gehört oder auf ihm keine Active Directory-Integration installiert ist, deaktivieren Sie die Transportsicherheit, indem Sie den Authentifizierungsmodus und die Schutzebene auf None festlegen, wie im folgenden Beispiel für einen Konfigurationscode gezeigt.If your computer is not part of a domain or does not have active directory integration installed, turn off transport security by setting the authentication mode and protection level to None as shown in the following sample configuration code:

    <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 explosed 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. Ändern Sie die Konfiguration sowohl auf dem Server als auch auf dem Client, bevor Sie das Beispiel ausführen.Ensure that you change the configuration on both the server and the client before you run the sample.

    Hinweis

    Das Festlegen von security mode auf None entspricht dem Festlegen von MsmqAuthenticationMode, MsmqProtectionLevel und der Message-Sicherheit auf None.Setting security mode to None is equivalent to setting MsmqAuthenticationMode, MsmqProtectionLevel, and Message security to None.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your computer. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Binding\Net\MSMQ\Volatile

Siehe auchSee Also