Megosztás:


Windows Communication Foundation és Message Queuing

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

  1. 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.

  2. 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.

    1. Nyissa meg a Kiszolgálókezelőt a Visual Studio 2012-ben.

    2. Nyissa meg a Funkciók lapot.

    3. Kattintson a jobb gombbal a Privát üzenetsorok elemre, majd válassza az Új>privát üzenetsor lehetőséget.

    4. Jelölje be a Tranzakciós jelölőnégyzetet.

    5. Adja meg ServiceModelSamplesTransacted az új üzenetsor neveként.

  3. 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.

  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. A szolgáltatásszámítógépen indítsa el a Service.exe parancssorból.

  5. Az ügyfélszámítógépen indítsa el a Client.exe parancssorból.

Lásd még