Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 servisi takip etmenize olanak tanıyan kendi kendine 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 ProcessOrder öğesini ayıklar ve siparişi işler.
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.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Uyarı
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.
Uyarı
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
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
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.
Visual Studio 2012'de Sunucu Yöneticisi'nin açılması.
Özellikler sekmesini genişletin.
Özel İleti Kuyrukları'ne sağ tıklayın ve ardından Yeni Özel Kuyruk'a> tıklayın.
İşlem kutusunu işaretleyin.
Yeni kuyruğun adı olarak
ServiceModelSamplesTransactedgirin.
Çözümün C# veya Visual Basic sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Ö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
\service\bin\ klasöründeki, dile özgü klasörün altındaki hizmet programı dosyalarını hizmet bilgisayarına kopyalayın.
\client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci bilgisayara kopyalayın.
Client.exe.config dosyasında, "." yerine hizmet bilgisayar adını belirtmek için istemci uç nokta adresini değiştirin.
Hizmet bilgisayarında bir komut isteminden Service.exe başlatın.
İstemci bilgisayarda bir komut isteminden Client.exe başlatın.