Aracılığıyla paylaş


Message Queuing'den Windows Communication Foundation'a

MsmqToWcf örneği, Message Queuing (MSMQ) uygulamasının Windows Communication Foundation (WCF) hizmetine nasıl MSMQ iletisi gönderebileceğini gösterir. Hizmet, kuyruğa alınmış iletileri alan servisi takip etmenize olanak tanıyan kendi kendine barındırılan bir konsol uygulamasıdır.

Hizmet sözleşmesi, kuyruklarla kullanıma uygun tek yönlü bir hizmeti tanımlar. MSMQ iletisinin Eylem üst bilgisi yoktur, bu nedenle farklı MSMQ iletilerini işlem sözleşmelerine otomatik olarak eşlemek mümkün değildir. Bu nedenle, yalnızca bir işlem sözleşmesi olabilir. Hizmet için birden fazla işlem sözleşmesi tanımlamak istiyorsanız, uygulamanın HANGI işlem sözleşmesinin gönderileceğine karar vermek için MSMQ iletisindeki hangi üst bilginin (örneğin, etiket veya bağıntı KIMLIĞI) kullanılabileceğini gösteren bilgiler sağlaması gerekir.

MSMQ iletisi, işlem sözleşmesi parametrelerine eşlenen üst bilgilerin hangileri olduğu hakkında bilgi içermez. Parametre, altında MSMQ iletisini içeren türde MsmqMessage<T>(MsmqMessage<T>). (MsmqMessage<T>) sınıfındaki MsmqMessage<T>"T" türü MSMQ ileti gövdesinde seri hale getirilmiş verileri temsil eder. Bu örnekte, PurchaseOrder türü MSMQ mesaj gövdesine serileştirilir.

Aşağıdaki örnek kod, sipariş işleme hizmetinin hizmet sözleşmesini gösterir.

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

Hizmet kendi sunucunuzda barındırılır. MSMQ kullanılırken, kullanılan kuyruk önceden oluşturulmalıdır. Bu, el ile veya kod aracılığıyla yapılabilir. Bu örnekte hizmet, kuyruğun varlığını denetler ve gerekirse oluşturur. Kuyruk adı yapılandırma dosyasından okunur.

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

Hizmet, aşağıdaki örnek kodda gösterildiği gibi ServiceHost için bir OrderProcessorService oluşturur ve açar.

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

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

Uyarı

Kuyruk adı, yerel bilgisayar için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır. WCF uç noktası adresi bir msmq.formatname şeması belirtir ve yerel bilgisayar için localhost kullanır. Kuyruk adresi, MSMQ Biçim Adı adresleme standartlarını izleyen msmq.formatname şemasına göre belirlenir.

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

İstemci uygulaması, bir MSMQ uygulamasıdır ve aşağıdaki örnek kodda gösterildiği gibi yöntemini kullanarak kuyruğa dayanıklı ve işlemsel bir ileti gönderir.

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

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

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

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Hizmet önce çalıştırılırsa, kuyruğun mevcut olup olmadığını kontrol eder. Kuyruk mevcut değilse, hizmet tarafından bir kuyruk oluşturulacaktır. 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'nin açılması.

    2. Özellikler sekmesini genişletin.

    3. Özel İleti Kuyruklarısağ tıklayın ve Yeni, Özel Kuyrukseçin.

    4. İşlem kutusunu işaretleyin.

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

  3. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluş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 orderQueueName değerini değiştirerek "." yerine hizmet bilgisayarı adını belirtin.

  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 bakınız