Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ukázka Volatile demonstruje, jak provádět volatilní komunikaci ve frontě pomocí přenosu služby Řízení front zpráv (MSMQ). Tato ukázka používá NetMsmqBinding. Služba v tomto případě je samohostovaná konzolová aplikace, která vám umožňuje sledovat přijímání zpráv ve frontě.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Při frontové komunikaci klient komunikuje pomocí fronty se službou. 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 tedy nemusí být spuštěny současně, aby mohly komunikovat 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í havárii správce front. Proto, pokud se správce fronty chybně ukončí, ne-transportní fronta použitá k ukládání volatilních zpráv přežije, ale samotné zprávy nikoli, protože 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 netransakční frontu pro odesílání nestálých zpráv.
Kontrakt služby v této ukázce je IStockTicker a definuje jednosměrné služby, které jsou nejvhodnější pro použití s frontami.
[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á uživatelem. 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 (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 je specifikován v sekci appSettings 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 zpětné lomítko jako oddělovač v jeho cestě při vytváření fronty pomocí System.Messaging. Adresa koncového bodu WCF (Windows Communication Foundation) určuje schéma net.msmq:, pro místní počítač používá "localhost" a lomítka ve své 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í netransakční 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
Jak nastavit, sestavit a spustit ukázku
Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.
Ve výchozím nastavení NetMsmqBindingje povolené zabezpečení přenosu. Pro zabezpečení přenosu MSMQ existují dvě relevantní vlastnosti, MsmqAuthenticationMode a MsmqProtectionLevel.. Ve výchozím nastavení je režim ověřování nastaven na Windows a úroveň ochrany je nastavena na Sign. 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
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
Noneje 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>Před spuštěním ukázky nezapomeňte změnit konfiguraci na serveru i klientovi.
Poznámka:
Nastavení
security modeje ekvivalentní nastaveníNone, MsmqAuthenticationMode a MsmqProtectionLevel zabezpečení naMessage.