Flyktig kommunikation i kö
Det flyktiga exemplet visar hur du utför instabil köad kommunikation via MSMQ-transporten (Message Queuing). Det här exemplet använder NetMsmqBinding. Tjänsten i det här fallet är ett lokalt konsolprogram som gör att du kan observera att tjänsten tar emot köade meddelanden.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
I kökommunikation kommunicerar klienten till tjänsten med hjälp av en kö. Mer exakt skickar klienten meddelanden till en kö. Tjänsten tar emot meddelanden från kön. Tjänsten och klienten behöver därför inte köras samtidigt för att kommunicera med en kö.
När du skickar ett meddelande utan garantier gör MSMQ bara ett bästa försök att leverera meddelandet, till skillnad från exakt en gång-försäkringar där MSMQ ser till att meddelandet levereras eller, om det inte kan levereras, meddelar dig att meddelandet inte kan levereras.
I vissa scenarier kanske du vill skicka ett flyktigt meddelande utan garantier över en kö, när leverans i tid är viktigare än att förlora meddelanden. Flyktiga meddelanden överlever inte köhanterarens krascher. Om köhanteraren kraschar överlever därför den icke-transaktionella kö som används för att lagra flyktiga meddelanden, men själva meddelandena gör det inte eftersom meddelandena inte lagras på disken.
Kommentar
Du kan inte skicka flyktiga meddelanden utan garantier inom omfånget för en transaktion med hjälp av MSMQ. Du måste också skapa en icke-transaktionell kö för att skicka flyktiga meddelanden.
Tjänstkontraktet i det här exemplet är IStockTicker
som definierar enkelriktade tjänster som passar bäst för användning med köer.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void StockTick(string symbol, float price);
}
Tjänsteåtgärden visar aktiesymbolen och priset enligt följande exempelkod:
public class StockTickerService : IStockTicker
{
public void StockTick(string symbol, float price)
{
Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
}
…
}
Tjänsten är lokalt installerad. När du använder MSMQ-transporten måste den kö som används skapas i förväg. Detta kan göras manuellt eller via kod. I det här exemplet innehåller tjänsten kod för att kontrollera om kön finns och skapa den om det behövs. Könamnet läse från konfigurationsfilen. Basadressen används av verktyget ServiceModel Metadata Utility (Svcutil.exe) för att generera proxyn för tjänsten.
// 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();
}
}
MSMQ-könamnet anges i avsnittet app Inställningar i konfigurationsfilen. Slutpunkten för tjänsten definieras i avsnittet system.serviceModel i konfigurationsfilen och anger bindningen netMsmqBinding
.
Kommentar
Könamnet använder en punkt (.) för den lokala datorn och omvänt snedstrecksavgränsare i sökvägen när du skapar en kö med hjälp av System.Messaging. WCF-slutpunktsadressen (Windows Communication Foundation) anger ett net.msmq:-schema, använder "localhost" för den lokala datorn och snedstreck i sökvägen.
Försäkringar och hållbarhet eller volatilitet för meddelanden anges också i konfigurationen.
<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>
Eftersom exemplet skickar köade meddelanden med hjälp av en icke-transaktionell kö kan inte transakterade meddelanden skickas till kön.
// 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();
När du kör exemplet visas klient- och tjänstaktiviteterna i både tjänst- och klientkonsolfönstren. Du kan se att tjänsten tar emot meddelanden från klienten. Tryck på RETUR i varje konsolfönster för att stänga av tjänsten och klienten. Observera att eftersom köer används behöver klienten och tjänsten inte vara igång samtidigt. Du kan köra klienten, stänga av den och sedan starta tjänsten och fortfarande ta emot dess meddelanden.
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
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Som standard NetMsmqBindingär transportsäkerheten aktiverad. Det finns två relevanta egenskaper för MSMQ-transportsäkerhet, MsmqAuthenticationMode och.
MsmqProtectionLevelsom standard är autentiseringsläget inställt på Windows
och skyddsnivån är inställd på Sign
. För att MSMQ ska kunna tillhandahålla autentiserings- och signeringsfunktionen måste den vara en del av en domän och active directory-integreringsalternativet för MSMQ måste vara installerat. Om du kör det här exemplet på en dator som inte uppfyller dessa kriterier får du ett fel.
Så här kör du exemplet på en dator som är ansluten till en arbetsgrupp eller utan Active Directory-integrering
Om datorn inte är en del av en domän eller inte har active directory-integrering installerad inaktiverar du transportsäkerheten genom att ställa in autentiseringsläget och skyddsnivån på
None
enligt följande exempelkonfigurationskod:<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>
Se till att du ändrar konfigurationen på både servern och klienten innan du kör exemplet.
Kommentar
Inställningen
security mode
tillNone
motsvarar inställningen MsmqAuthenticationMode, MsmqProtectionLevelochMessage
säkerhet tillNone
.