Exchange Messages with WCF
Endpoints and Message Queuing Applications
Você pode integrar existentes Message Queuing (MSMQ)
aplicações com o Windows Communication Foundation (WCF) aplicativos usando a
integração MSMQ ligação para converter mensagens MSMQ para mensagens do WCF. Isto permite-lhe pôr em aplicações
receptor de clientes MSMQ do WCF, bem como chamada em serviços WCF a partir de
aplicações MSMQ remetente.
Nesta seção, vamos
explicar como usar MsmqIntegrationBinding para a comunicação entre na fila (1)
um cliente WCF e um serviço de aplicação MSMQ escrito usando System.Messaging e
(2) um aplicativo cliente MSMQ e um serviço WCF.
Para um exemplo
completo que demonstra como chamar um aplicativo receptor MSMQ de um cliente
WCF, consulte o link Windows Communication
Foundation para o enfileiramento de mensagens.
Para um exemplo
completo que demonstra como chamar um serviço WCF de um cliente MSMQ, consulte
o link enfileiramento de
mensagens para o Windows Communication Foundation.
Para criar um serviço WCF que recebe
mensagens de um cliente MSMQ
1. Definir uma interface que define o contrato de
serviço para o serviço WCF que recebe as mensagens na fila de um aplicativo
remetente MSMQ, como mostrado no seguinte exemplo de código.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
public class OrderProcessorService : IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> ordermsg)
{
PurchaseOrder po = (PurchaseOrder)ordermsg.Body;
Random statusIndexer = new Random();
po.Status = (OrderStates)statusIndexer.Next(3);
Console.WriteLine("Processing {0} ", po);
}
public static void Main()
{
// Get base address from appsettings in configuration.
Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
// Create a ServiceHost for the CalculatorService type and provide the base address.
using (ServiceHost serviceHost = new ServiceHost(typeof(IOrderProcessor), baseAddress))
{
// Open the ServiceHostBase to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("The service is running in the following account: {0}", WindowsIdentity.GetCurrent().Name);
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
serviceHost.Close();
}
}
}3. Criar um arquivo de configuração que especifica o MsmqIntegrationBinding.
<configuration>
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="orderQueueName" value=".\private$\Orders" />
<add key="baseAddress" value="http://localhost:8000/ServiceModelSamples/Service" />
</appSettings>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.OrderProcessorService" >
<endpoint address="msmq.formatname:DIRECT=OS:.\private$\Orders"
binding="msmqIntegrationBinding"
bindingConfiguration="OrderProcessorBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor">
</endpoint>
</service>
</services>
<bindings>
<msmqIntegrationBinding>
<binding name="OrderProcessorBinding" >
<security mode="None" />
</binding>
</msmqIntegrationBinding>
</bindings>
</system.serviceModel >
</configuration>
// 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;
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();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Nenhum comentário:
Postar um comentário