Sdílet prostřednictvím


Nestálá komunikace ve frontě

Ukázka Volatile ukazuje, jak provádět nestálou komunikaci ve frontě přes přenos služby Řízení front zpráv (MSMQ). Tato ukázka používá NetMsmqBinding. Služba v tomto případě je konzolová aplikace v místním prostředí, která umožňuje sledovat příjem zpráv ve frontě.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Ve frontě komunikace klient komunikuje se službou pomocí fronty. Přesněji řečeno, klient odesílá zprávy do fronty. Služba přijímá zprávy z fronty. Služba a klient proto nemusí být spuštěna ve stejnou dobu, aby komunikovaly pomocí fronty.

Když odešlete zprávu bez záruk, MSMQ se snaží zprávu doručit jen co nejlépe, na rozdíl od záruky Přesně jednou, kdy MSMQ zajistí doručení zprávy, nebo pokud ji nelze doručit, informuje vás, že zprávu nelze doručit.

V určitých scénářích můžete chtít odeslat nestálou zprávu bez záruk ve frontě, pokud je včasné doručení důležitější než ztráta zpráv. Nestálé zprávy nepřežijí chyby správce front. Proto pokud se správce fronty chybově ukončí, neuskuteční fronta použitá k ukládání nestálých zpráv přežije, ale samotné zprávy se neukládají, protože zprávy nejsou uloženy na disku.

Poznámka:

Nestálé zprávy nelze odesílat bez záruk v rámci transakce pomocí MSMQ. Musíte také vytvořit neaktuální frontu pro odesílání nestálých zpráv.

Kontrakt služby v této ukázce definuje IStockTicker jednosměrné služby, které jsou nejvhodnější pro použití s řazením front.

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

Operace služby zobrazí symbol a cenu akcií, jak je znázorněno v následujícím vzorovém kódu:

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

Služba je hostovaná v místním prostředí. Při použití přenosu MSMQ je nutné předem vytvořit použitou frontu. Můžete to provést ručně nebo prostřednictvím kódu. V této ukázce obsahuje služba kód, který zkontroluje existenci fronty, a v případě potřeby ji vytvoří. Název fronty se načte z konfiguračního souboru. Základní adresu používá nástroj ServiceModel Metadata Utility Tool (Svcutil.exe) k vygenerování proxy serveru pro službu.

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

Název fronty MSMQ se zadává v části aplikace Nastavení konfiguračního souboru. Koncový bod pro službu je definován v části system.serviceModel konfiguračního souboru a určuje netMsmqBinding vazbu.

Poznámka:

Název fronty používá tečku (.) pro místní počítač a oddělovače zpětného lomítka v jeho cestě při vytváření fronty pomocí System.Messaging. Adresa koncového bodu Wcf (Windows Communication Foundation) určuje net.msmq: scheme, používá "localhost" pro místní počítač a lomítka v jeho cestě.

Záruky a stálost nebo nestálost zpráv jsou také uvedeny v konfiguraci.

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

Vzhledem k tomu, že ukázka odesílá zprávy zařazené do fronty pomocí neaktuální fronty, nelze do fronty odesílat transakční zprávy.

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

Při spuštění ukázky se aktivity klienta a služeb zobrazí v oknech služby i konzoly klienta. Můžete vidět, že služba přijímá zprávy od klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete službu a klienta. Všimněte si, že vzhledem k tomu, že se používá řízení front, nemusí být klient a služba ve stejnou dobu spuštěné. Klienta můžete spustit, vypnout ho a pak spustit službu a stále přijímat její zprávy.

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

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.

Ve výchozím nastavení NetMsmqBindingje povolené zabezpečení přenosu. Pro zabezpečení MsmqAuthenticationMode přenosu MSMQ existují dvě relevantní vlastnosti a MsmqProtectionLevel. ve výchozím nastavení je režim ověřování nastavený Windows na úroveň Signochrany . Aby služba MSMQ poskytovala funkci ověřování a podepisování, musí být součástí domény a musí být nainstalovaná možnost integrace služby Active Directory pro MSMQ. Pokud tuto ukázku spustíte na počítači, který nesplňuje tato kritéria, zobrazí se chyba.

Spuštění ukázky na počítači připojeném k pracovní skupině nebo bez integrace služby Active Directory

  1. Pokud váš počítač není součástí domény nebo nemá nainstalovanou integraci služby Active Directory, vypněte zabezpečení přenosu nastavením režimu ověřování a úrovně ochrany tak, jak None je znázorněno v následujícím ukázkovém konfiguračním kódu:

    <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. Před spuštěním ukázky nezapomeňte změnit konfiguraci na serveru i klientovi.

    Poznámka:

    Nastavení security mode , které None odpovídá nastavení MsmqAuthenticationMode, MsmqProtectionLevela Message zabezpečení pro None.