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 Transacted sample demonstruje, jak provádět transakční komunikaci ve frontě pomocí služby Řízení front zpráv (MSMQ).
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 proto nemusí být spuštěny ve stejnou dobu, aby mohly komunikovat pomocí fronty.
Pokud se transakce používají k odesílání a příjmu zpráv, existují ve skutečnosti dvě samostatné transakce. Když klient odesílá zprávy v rámci transakce, transakce je místní pro klienta a správce front klienta. Když služba přijímá zprávy v rámci transakce, transakce je místní pro službu a správce přijímající fronty. Je velmi důležité si uvědomit, že klient a služba se neúčastní stejné transakce; spíše používají různé transakce při provádění svých operací (například odesílání a přijímání) s frontou.
V této ukázce klient odešle do služby dávku zpráv z rozsahu transakce. Zprávy odeslané do fronty pak služba přijímá v rámci oboru transakce definovaného službou.
Kontrakt služby je , jak je IOrderProcessorznázorněno v následujícím vzorovém kódu. Rozhraní definuje jednosměrnou službu, která je vhodná pro použití s frontami.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void SubmitPurchaseOrder(PurchaseOrder po);
}
Chování služby určuje chování operace s TransactionScopeRequired nastaveným na true. Tím se zajistí, že stejný obor transakce, který se používá k načtení zprávy z fronty, budou používat správci prostředků, ke kterým tato metoda přistupuje. Zaručuje také, že pokud metoda vyvolá výjimku, zpráva se vrátí do fronty. Bez nastavení tohoto chování operace kanál ve frontě vytvoří transakci pro čtení zprávy z fronty a potvrdí ji automaticky před odesláním tak, aby v případě selhání operace byla zpráva ztracena. Nejběžnějším scénářem je, že operace služby se zapojí do transakce, která se používá ke čtení zprávy z fronty, jak je znázorněno v následujícím kódu.
// This service class that implements the service contract.
// This added code writes output to the console window.
public class OrderProcessorService : IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po)
{
Orders.Add(po);
Console.WriteLine("Processing {0} ", po);
}
…
}
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 pro kontrolu existence fronty a její vytvoření, pokud neexistuje. 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 pro službu.
// Host the service within this EXE console application.
public static void Main()
{
// Get the MSMQ queue name from appSettings in configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the transacted MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
// Create a ServiceHost for the OrderProcessorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
// 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 shut down the service.
serviceHost.Close();
}
}
Název fronty MSMQ je zadaný v části appSettings konfiguračního souboru, jak je znázorněno v následující ukázkové konfiguraci.
<appSettings>
<add key="queueName" value=".\private$\ServiceModelSamplesTransacted" />
</appSettings>
Poznámka:
Název fronty používá tečku (.) pro místní počítač a zpětná lomítka jako oddělovače v cestě názvu fronty při vytváření fronty pomocí System.Messaging. Koncový bod WCF (Windows Communication Foundation) používá adresu fronty se schématem net.msmq, k označení místního počítače používá "localhost", a v cestě používá lomítka doprava.
Klient vytvoří obor transakce. Komunikace s frontou probíhá v rámci transakce, což způsobuje, že je považována za atomickou jednotku, kde se buď všechny zprávy odesílají do fronty, nebo se do fronty neodesílá žádná. Transakce je potvrzena voláním Complete oboru transakce.
// Create a client.
OrderProcessorClient client = new OrderProcessorClient();
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
// Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
// Make a queued call to submit the purchase order.
client.SubmitPurchaseOrder(po);
// Complete the transaction.
scope.Complete();
}
// Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Pokud chcete ověřit, že transakce fungují, upravte klienta tak, že okomentujte obor transakce, jak je znázorněno v následujícím ukázkovém kódu, znovu sestavte řešení a spusťte klienta.
//scope.Complete();
Protože transakce není dokončena, zprávy se neodesílají do fronty.
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 a pak spustit službu a stále přijímat zprávy.
The service is ready.
Press <ENTER> to terminate service.
Processing Purchase Order: 7b31ce51-ae7c-4def-9b8b-617e4288eafd
Customer: somecustomer.com
OrderDetails
Order LineItem: 54 of Blue Widget @unit price: $29.99
Order LineItem: 890 of Red Widget @unit price: $45.89
Total cost of this order: $42461.56
Order status: Pending
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 je služba spuštěná jako první, zkontroluje, jestli je fronta k dispozici. Pokud fronta není k dispozici, služba ji vytvoří. Službu můžete nejprve spustit, abyste vytvořili frontu, nebo ji můžete vytvořit prostřednictvím Správce front MSMQ. Podle těchto kroků vytvořte frontu v systému Windows 2008.
Otevřete Správce serveru v sadě Visual Studio 2012.
Rozbalte panel Funkce.
Klikněte pravým tlačítkem na Soukromé fronty zpráva vyberte Nová, soukromá fronta.
Zaškrtněte políčko Transakční.
Jako název nové fronty zadejte
ServiceModelSamplesTransacted.
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 s jedním počítačem nebo konfiguraci na více počítačích, postupujte podle pokynů v části Spouštění ukázek Windows Communication Foundation.
Ve výchozím nastavení NetMsmqBindingje povolené zabezpečení přenosu. Existují dvě relevantní vlastnosti pro zabezpečení přenosu MSMQ, MsmqAuthenticationMode a MsmqProtectionLevel. Ve výchozím nastavení je režim ověřování nastavený 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 vzorovém konfiguračním kódu.<system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.OrderProcessorService" behaviorConfiguration="OrderProcessorServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <!-- Define NetMsmqEndpoint. --> <endpoint address="net.msmq://localhost/private/ServiceModelSamplesTransacted" binding="netMsmqBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.IOrderProcessor" /> <!-- 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="Binding1"> <security mode="None" /> </binding> </netMsmqBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="OrderProcessorServiceBehavior"> <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.