Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az MsmqToWcf-minta bemutatja, hogy egy Message Queuing (MSMQ) alkalmazás hogyan küldhet MSMQ-üzenetet egy Windows Communication Foundation (WCF) szolgáltatásnak. A szolgáltatás egy saját üzemeltetésű konzolalkalmazás, amely lehetővé teszi az üzenetsorba helyezett üzeneteket fogadó szolgáltatás megfigyelését.
A szolgáltatási szerződés egy egyirányú szolgáltatást határoz meg, amely alkalmas az üzenetsorok kezelésére. Az MSMQ-üzenetek nem rendelkeznek műveletfejléccel, így nem lehet különböző MSMQ-üzeneteket automatikusan hozzárendelni a műveleti szerződésekhez. Ezért csak egy műveleti szerződés lehet. Ha több műveleti szerződést szeretne meghatározni a szolgáltatáshoz, az alkalmazásnak meg kell adnia az MSMQ-üzenetben szereplő fejlécet (például a címkét vagy a korrelációs azonosítót) annak eldöntéséhez, hogy melyik műveleti szerződést küldje el.
Az MSMQ-üzenet nem tartalmaz információt arról, hogy mely fejlécek vannak leképezve a műveleti szerződés különböző paramétereihez. A paraméter típusa MsmqMessage<T>(MsmqMessage<T>), amely a mögöttes MSMQ-üzenetet tartalmazza. Az MsmqMessage<T> "T" típus a (MsmqMessage<T>) osztályban jelöli az MSMQ-üzenettörzsbe szerializált adatokat. Ebben a mintában a PurchaseOrder típus szerializálva lesz az MSMQ üzenettörzsében.
Az alábbi mintakód a rendelésfeldolgozó szolgáltatás szolgáltatási szerződését mutatja be.
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
A szolgáltatás saját üzemeltetésű. AZ MSMQ használatakor a használt üzenetsort előre létre kell hozni. Ez manuálisan vagy kódon keresztül is elvégezhető. Ebben a mintában a szolgáltatás ellenőrzi az üzenetsor meglétét, és szükség esetén létrehozza azt. A sor nevét a konfigurációs fájlból olvassák be.
public static void Main()
{
// Get the MSMQ queue name from the application settings in
// configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
…
}
A szolgáltatás létrehoz és megnyit egy ServiceHost a OrderProcessorService számára, ahogy az a következő mintakódban látható.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
serviceHost.Close();
}
Az MSMQ-üzenetsor neve a konfigurációs fájl AppSettings szakaszában van megadva, ahogyan az az alábbi mintakonfigurációban látható.
Megjegyzés:
Az sor neve pontot (.) használ a helyi számítógéphez, és perjeleket az elérési útvonalában. A WCF végpontcíme egy msmq.formatname sémát határoz meg, és a localhostot használja a helyi számítógéphez. Az egyes MSMQ formátumnév-címzési irányelvekhez tartozó üzenetsor címe az msmq.formatname sémát követi.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Az ügyfélalkalmazás egy MSMQ-alkalmazás, amely a Send módszerrel tartós és tranzakciós üzenetet küld az üzenetsorba, ahogyan az az alábbi mintakódban látható.
//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);
// 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;
// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
// Complete the transaction.
scope.Complete();
}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
A minta futtatásakor az ügyfél- és szolgáltatástevékenységek a szolgáltatás és az ügyfélkonzol ablakaiban is megjelennek. Láthatja, hogy a szolgáltatás üzeneteket fogad az ügyféltől. A szolgáltatás és az ügyfél leállításához nyomja le az ENTER billentyűt az egyes konzolablakokban. Vegye figyelembe, hogy mivel a sorba állítás használatban van, az ügyfélnek és a szolgáltatásnak nem kell egyszerre üzemelnie. Futtathatja például a klienst, leállíthatja, majd elindíthatja a szolgáltatást, és az továbbra is megkapja az üzeneteit.
A minta beállítása, összeállítása és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
Ha a szolgáltatást először futtatják, ellenőrzi, hogy az üzenetsor jelen van-e. Ha az üzenetsor nincs jelen, a szolgáltatás létrehoz egyet. Először futtathatja a szolgáltatást az üzenetsor létrehozásához, vagy létrehozhat egyet az MSMQ Queue Manageren keresztül. Az alábbi lépéseket követve hozzon létre egy sort a Windows Server 2008-ban.
Nyissa meg a Kiszolgálókezelőt a Visual Studio 2012-ben.
Nyissa meg a Funkciók lapot.
Kattintson a jobb gombbal a Privát üzenetsorokelemre, és válassza Új, Privát üzenetsorlehetőséget.
Jelölje be a Tranzakciós jelölőnégyzetet.
Adja meg
ServiceModelSamplesTransactedaz új üzenetsor neveként.
A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
Ha a mintát egy számítógép konfigurációjában szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatására vonatkozó utasításokat.
A minta futtatása számítógépeken
Másolja a szolgáltatásprogram fájljait a \service\bin\ mappából a nyelvspecifikus mappából a szolgáltatásszámítógépre.
Másolja az ügyfélprogram fájljait a \client\bin\ mappából a nyelvspecifikus mappából az ügyfélszámítógépre.
A Client.exe.config fájlban módosítsa az orderQueueName nevet úgy, hogy a "." helyett a szolgáltatásszámítógép nevét adja meg.
A szolgáltatásszámítógépen indítsa el a Service.exe parancssorból.
Az ügyfélszámítógépen indítsa el a Client.exe parancssorból.