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.
A WcfToMsmq minta bemutatja, hogy egy Windows Communication Foundation (WCF) alkalmazás hogyan küldhet üzenetet egy Üzenetsor-kezelő (MSMQ) alkalmazá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ásnak és az ügyfélnek nem kell egyszerre futnia.
A szolgáltatás üzeneteket fogad az üzenetsorból, és feldolgozza a rendeléseket. A szolgáltatás létrehoz egy tranzakciós üzenetsort, és beállít egy fogadott üzenetkezelőt az alábbi mintakódban látható módon.
static void Main(string[] args)
{
if (!MessageQueue.Exists(
ConfigurationManager.AppSettings["queueName"]))
MessageQueue.Create(
ConfigurationManager.AppSettings["queueName"], true);
//Connect to the queue
MessageQueue Queue = new
MessageQueue(ConfigurationManager.AppSettings["queueName"]);
Queue.ReceiveCompleted +=
new ReceiveCompletedEventHandler(ProcessOrder);
Queue.BeginReceive();
Console.WriteLine("Order Service is running");
Console.ReadLine();
}
Amikor üzenet érkezik az üzenetsorba, a rendszer meghívja az üzenetkezelőt ProcessOrder .
public static void ProcessOrder(Object source,
ReceiveCompletedEventArgs asyncResult)
{
try
{
// Connect to the queue.
MessageQueue Queue = (MessageQueue)source;
// End the asynchronous receive operation.
System.Messaging.Message msg =
Queue.EndReceive(asyncResult.AsyncResult);
msg.Formatter = new System.Messaging.XmlMessageFormatter(
new Type[] { typeof(PurchaseOrder) });
PurchaseOrder po = (PurchaseOrder) msg.Body;
Random statusIndexer = new Random();
po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
Console.WriteLine("Processing {0} ", po);
Queue.BeginReceive();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
A szolgáltatás kinyeri az ProcessOrder MSMQ üzenettörzséből, és feldolgozza a sorrendet.
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ó.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Megjegyzés:
Az sor neve pontot (.) használ a helyi számítógéphez, és perjeleket az elérési útvonalában.
Az ügyfél létrehoz egy vásárlási rendelést, és elküldi a vásárlási rendelést egy tranzakció hatókörén belül, ahogyan az az alábbi mintakódban látható.
// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...
OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");
MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
client.SubmitPurchaseOrder(ordermsg);
scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);
//Closing the client gracefully closes the connection and cleans up resources
client.Close();
Az ügyfél egy egyedi kliensprogramot használ az MSMQ-üzenet üzenetsorba küldésére. Mivel az üzenetet fogadó és feldolgozó alkalmazás nem WCF-alkalmazás, hanem MSMQ-alkalmazás, a két alkalmazás között nincs implicit szolgáltatási szerződés. Ebben a forgatókönyvben tehát nem hozhatunk létre proxyt a Svcutil.exe eszközzel.
Az egyéni ügyfél lényegében ugyanaz az összes WCF-alkalmazás esetében, amely a kötést használja az MsmqIntegration üzenetek küldésére. Más ügyfelektől eltérően nem tartalmaz szolgáltatási műveleteket. Csak küldési üzenet művelet.
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
public OrderProcessorClient(){}
public OrderProcessorClient(string configurationName)
: base(configurationName)
{ }
public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
: base(binding, address)
{ }
public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
{
base.Channel.SubmitPurchaseOrder(msg);
}
}
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.
Megjegyzés:
Ehhez a mintához telepíteni kell a Message Queuinget. Tekintse meg a Message Queuing telepítési utasításait.
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 üzenetsorok elemre, majd válassza az Új>privát üzenetsor lehető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 kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
A minta egyszámítógépes konfigurációban való futtatásához 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 ügyfélvégpont címét úgy, hogy a szolgáltatás számítógépének nevét adja meg a "." helyett.
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.