Z WCF do Řízení front zpráv
Ukázka WcfToMsmq ukazuje, jak může aplikace WCF (Windows Communication Foundation) odeslat zprávu do aplikace Služby řízení front zpráv (MSMQ). Služba je konzolová aplikace v místním prostředí, která umožňuje sledovat službu, která přijímá zprávy ve frontě. Služba a klient nemusí být spuštěny současně.
Služba přijímá zprávy z fronty a zpracovává objednávky. Služba vytvoří transakční frontu a nastaví obslužnou rutinu přijaté zprávy, jak je znázorněno v následujícím ukázkovém kódu.
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();
}
Při přijetí zprávy ve frontě je vyvolána obslužná rutina ProcessOrder
zprávy.
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);
}
}
Služba extrahuje ProcessOrder
text zprávy MSMQ a zpracuje pořadí.
Název fronty MSMQ se zadává v aplikaci Nastavení části konfiguračního souboru, jak je znázorněno v následující ukázkové konfiguraci.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Poznámka:
Název fronty používá tečku (.) pro místní počítač a oddělovače zpětného lomítka v jeho cestě.
Klient vytvoří nákupní objednávku a odešle nákupní objednávku v rámci transakce, jak je znázorněno v následujícím vzorovém kódu.
// 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();
Klient používá vlastního klienta k odeslání zprávy MSMQ do fronty. Vzhledem k tomu, že aplikace, která přijímá a zpracovává zprávu, je aplikace MSMQ, a nikoli aplikace WCF, neexistuje mezi těmito dvěma aplikacemi implicitní kontrakt služby. Proto v tomto scénáři nemůžeme vytvořit proxy server pomocí nástroje Svcutil.exe.
Vlastní klient je v podstatě stejný pro všechny aplikace WCF, které používají MsmqIntegration
vazbu k odesílání zpráv. Na rozdíl od jiných klientů nezahrnuje celou řadu operací služby. Jedná se pouze o operaci odeslání zprávy.
[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);
}
}
Při spuštění ukázky se aktivity klienta a služeb zobrazí v oknech služby i konzoly klienta. Můžete vidět, že služba přijímá zprávy od klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete službu a klienta. Všimněte si, že vzhledem k tomu, že se používá řízení front, nemusí být klient a služba ve stejnou dobu spuštěné. Můžete například spustit klienta, vypnout ho a pak spustit službu a stále by přijímala zprávy.
Poznámka:
Tato ukázka vyžaduje instalaci služby Řízení front zpráv. Přečtěte si pokyny k instalaci ve službě Řízení front zpráv.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud je služba spuštěná jako první, zkontroluje, jestli je fronta k dispozici. Pokud fronta není k dispozici, služba ji vytvoří. Službu můžete nejprve spustit, abyste vytvořili frontu, nebo ji můžete vytvořit prostřednictvím Správce front MSMQ. Podle těchto kroků vytvořte frontu v systému Windows 2008.
Otevřete Správce serveru v sadě Visual Studio 2012.
Rozbalte kartu Funkce.
Klikněte pravým tlačítkem myši na soukromé fronty zpráv a pak vyberte Nová>soukromá fronta.
Zaškrtněte políčko Transactional (Transakce).
Zadejte
ServiceModelSamplesTransacted
jako název nové fronty.
Pokud chcete sestavit edici jazyka C# nebo Visual Basic řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním počítačem, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.
Spuštění ukázky napříč počítači
Zkopírujte soubory programu služby ze složky \service\bin\ ve složce specifické pro jazyk do počítače služby.
Zkopírujte soubory klientského programu ze složky \client\bin\ ve složce specifické pro jazyk do klientského počítače.
V souboru Client.exe.config změňte adresu koncového bodu klienta tak, aby místo "".
Na počítači služby spusťte Service.exe z příkazového řádku.
Na klientském počítači spusťte Client.exe z příkazového řádku.