Aracılığıyla paylaş


Windows Communication Foundation'dan İleti Kuyruğuna

WcfToMsmq örneği, bir Windows Communication Foundation (WCF) uygulamasının message Queuing (MSMQ) uygulamasına nasıl ileti gönderebileceğini gösterir. Hizmet, kuyruğa alınmış iletileri alan hizmeti gözlemlemenizi sağlayan şirket içinde barındırılan bir konsol uygulamasıdır. Hizmet ve istemcinin aynı anda çalışması gerekmez.

Hizmet kuyruktan iletiler alır ve siparişleri işler. Hizmet, aşağıdaki örnek kodda gösterildiği gibi bir işlem kuyruğu oluşturur ve alınan ileti işleyicisini ayarlar.

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();
}

Kuyrukta bir ileti alındığında, ileti işleyicisi ProcessOrder çağrılır.

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);
    }

}

Hizmet, MSMQ ileti gövdesinden öğesini ayıklar ProcessOrder ve sırayı işler.

MSMQ kuyruğu adı, aşağıdaki örnek yapılandırmada gösterildiği gibi yapılandırma dosyasının uygulama Ayarlar bölümünde belirtilir.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

Not

Kuyruk adı, yerel bilgisayar için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır.

İstemci bir satınalma siparişi oluşturur ve aşağıdaki örnek kodda gösterildiği gibi satınalma siparişini bir işlem kapsamında gönderir.

// 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();

İstemci, kuyruğa MSMQ iletisi göndermek için özel bir istemci kullanır. İletiyi alan ve işleyen uygulama WCF uygulaması değil MSMQ uygulaması olduğundan, iki uygulama arasında örtük bir hizmet sözleşmesi yoktur. Bu nedenle, bu senaryoda Svcutil.exe aracını kullanarak ara sunucu oluşturamıyoruz.

Özel istemci temelde, iletileri göndermek için bağlamayı MsmqIntegration kullanan tüm WCF uygulamaları için aynıdır. Diğer istemcilerden farklı olarak, bir dizi hizmet işlemi içermez. Yalnızca ileti gönderme işlemidir.

[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);
    }
}

Örneği çalıştırdığınızda, istemci ve hizmet etkinlikleri hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmetin istemciden ileti aldığını görebilirsiniz. Hizmeti ve istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın. Kuyruğa alma kullanımda olduğundan istemcinin ve hizmetin aynı anda çalışır durumda olması gerekmediğini unutmayın. Örneğin, istemciyi çalıştırabilir, kapatabilir ve ardından hizmeti başlatabilir ve yine de iletilerini alabilirsiniz.

Not

Bu örnek, Message Queuing'in yüklenmesini gerektirir. Message Queuing'deki yükleme yönergelerine bakın.

Örneği ayarlama, derleme ve çalıştırma

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Hizmet önce çalıştırılırsa kuyruğun mevcut olduğundan emin olmak için denetler. Kuyruk yoksa, hizmet bir kuyruk oluşturur. Kuyruğu oluşturmak için önce hizmeti çalıştırabilir veya MSMQ Kuyruk Yöneticisi aracılığıyla bir kuyruk oluşturabilirsiniz. Windows 2008'de kuyruk oluşturmak için bu adımları izleyin.

    1. Visual Studio 2012'de Sunucu Yöneticisi açın.

    2. Özellikler sekmesini genişletin.

    3. Özel İleti Kuyrukları'ne sağ tıklayın ve ardından Yeni Özel Kuyruk'a> tıklayın.

    4. İşlem kutusunu işaretleyin.

    5. Yeni kuyruğun adı olarak girin ServiceModelSamplesTransacted .

  3. Çözümün C# veya Visual Basic sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  4. Örneği tek bilgisayarlı bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

Örneği bilgisayarlar arasında çalıştırma

  1. \service\bin\ klasöründeki, dile özgü klasörün altındaki hizmet programı dosyalarını hizmet bilgisayarına kopyalayın.

  2. \client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci bilgisayara kopyalayın.

  3. Client.exe.config dosyasında, "." yerine hizmet bilgisayar adını belirtmek için istemci uç noktası adresini değiştirin.

  4. Hizmet bilgisayarında bir komut isteminden Service.exe başlatın.

  5. İstemci bilgisayarda bir komut isteminden Client.exe başlatın.

Ayrıca bkz.