Windows Communication Foundation till Message Queuing
WcfToMsmq-exemplet visar hur ett WCF-program (Windows Communication Foundation) kan skicka ett meddelande till ett MSMQ-program (Message Queuing). Tjänsten är ett konsolprogram med egen värd som gör att du kan observera att tjänsten tar emot köade meddelanden. Tjänsten och klienten behöver inte köras samtidigt.
Tjänsten tar emot meddelanden från kön och bearbetar beställningar. Tjänsten skapar en transaktionskö och konfigurerar en meddelandehanterare för mottaget meddelande, enligt följande exempelkod.
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();
}
När ett meddelande tas emot i kön anropas meddelandehanteraren 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);
}
}
Tjänsten extraherar ProcessOrder
från MSMQ-meddelandetexten och bearbetar ordern.
MSMQ-könamnet anges i en app Inställningar avsnitt i konfigurationsfilen, enligt följande exempelkonfiguration.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Kommentar
Könamnet använder en punkt (.) för den lokala datorn och omvänt snedstrecksavgränsare i sökvägen.
Klienten skapar en inköpsorder och skickar inköpsordern inom omfånget för en transaktion, enligt följande exempelkod.
// 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();
Klienten använder en anpassad klient för att skicka MSMQ-meddelandet till kön. Eftersom programmet som tar emot och bearbetar meddelandet är ett MSMQ-program och inte ett WCF-program, finns det inget implicit tjänstkontrakt mellan de två programmen. Därför kan vi inte skapa en proxy med hjälp av verktyget Svcutil.exe i det här scenariot.
Den anpassade klienten är i stort sett densamma för alla WCF-program som använder bindningen MsmqIntegration
för att skicka meddelanden. Till skillnad från andra klienter innehåller den inte ett antal tjänståtgärder. Det är endast en skicka meddelandeåtgärd.
[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);
}
}
När du kör exemplet visas klient- och tjänstaktiviteterna i både tjänst- och klientkonsolfönstren. Du kan se att tjänsten tar emot meddelanden från klienten. Tryck på RETUR i varje konsolfönster för att stänga av tjänsten och klienten. Observera att eftersom köer används behöver klienten och tjänsten inte vara igång samtidigt. Du kan till exempel köra klienten, stänga av den och sedan starta tjänsten och ändå ta emot dess meddelanden.
Kommentar
Det här exemplet kräver installation av Message Queuing. Se installationsanvisningarna i Message Queuing.
Konfigurera, skapa och köra exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om tjänsten körs först kontrollerar den att kön finns. Om kön inte finns skapar tjänsten en. Du kan köra tjänsten först för att skapa kön, eller så kan du skapa en via MSMQ Queue Manager. Följ de här stegen för att skapa en kö i Windows 2008.
Öppna Serverhanteraren i Visual Studio 2012.
Expandera fliken Funktioner .
Högerklicka på Privata meddelandeköer och välj sedan Ny>privat kö.
Markera rutan Transaktionell .
Ange
ServiceModelSamplesTransacted
som namnet på den nya kön.
Om du vill skapa C#- eller Visual Basic-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en enda dator följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Kör exemplet mellan datorer
Kopiera tjänstprogramfilerna från mappen \service\bin\ under den språkspecifika mappen till tjänstdatorn.
Kopiera klientprogramfilerna från mappen \client\bin\ under den språkspecifika mappen till klientdatorn.
I filen Client.exe.config ändrar du klientens slutpunktsadress så att namnet på tjänstdatorn anges i stället för "".
Starta Service.exe från en kommandotolk på tjänstdatorn.
Starta Client.exe från en kommandotolk på klientdatorn.