Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el ejemplo MsmqActivation se muestra cómo hospedar aplicaciones en el Servicio de activación de procesos de Windows (WAS) que se leen desde una cola de mensajes. Este ejemplo utiliza el netMsmqBinding y se basa en el ejemplo Two-Way Comunicación. El servicio en este caso es una aplicación hospedada en web y el cliente es autohospedado y proporciona resultados a la consola para observar el estado de pedidos de compra enviados.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
El servicio de activación de procesos de Windows (WAS), el nuevo mecanismo de activación de procesos para Windows Server 2008, proporciona características similares a IIS que anteriormente solo estaban disponibles para las aplicaciones basadas en HTTP a las aplicaciones que usan protocolos que no son HTTP. Windows Communication Foundation (WCF) usa la interfaz de adaptador del cliente de escucha para comunicar solicitudes de activación que se reciben a través de protocolos no HTTP que WCF admite, como TCP, canalizaciones con nombre y MSMQ. La funcionalidad para recibir solicitudes a través de protocolos que no son HTTP se hospeda en servicios administrados de Windows que se ejecutan en SMSvcHost.exe.
El servicio Net.Msmq Listener Adapter (NetMsmqActivator) activa aplicaciones en cola basadas en mensajes en la cola.
El cliente envía pedidos de compra al servicio desde el ámbito de una transacción. El servicio recibe los pedidos en una transacción y los procesa. A continuación, el servicio llama al cliente con el estado del pedido. Para facilitar la comunicación bidireccional, tanto el cliente como el servicio utilizan las colas para poner en cola los pedidos de compra y el estado de la orden.
El contrato de servicio IOrderProcessor define operaciones de servicio unidireccionales que funcionan en cola. La operación del servicio utiliza el extremo de respuesta para enviar estados de orden al cliente. La dirección del punto final de respuesta es el URI de la cola utilizada para enviar el estado del pedido de vuelta al cliente. La aplicación de procesamiento de pedidos implementa este contrato.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void SubmitPurchaseOrder(PurchaseOrder po,
string reportOrderStatusTo);
}
El cliente especifica el contrato de la respuesta para enviar el estado de la orden. El cliente implementa el contrato sobre el estado del pedido. El servicio usa el cliente generado de este contrato para devolver el estado del pedido al cliente.
[ServiceContract]
public interface IOrderStatus
{
[OperationContract(IsOneWay = true)]
void OrderStatus(string poNumber, string status);
}
La operación de servicio procesa el pedido de compra enviado.
OperationBehaviorAttribute se aplica a la operación del servicio para especificar la inscripción automática en la transacción que se utiliza para recibir el mensaje de la cola y la realización automática de la transacción en la realización de la operación del servicio. La Orders clase encapsula la funcionalidad de procesamiento de pedidos. En este caso, agrega el pedido de compra a un diccionario. La transacción en la que está inscrita la operación de servicio está disponible para las operaciones de la clase Orders.
La operación de servicio, además de procesar el pedido de compra enviado, responde al cliente sobre el estado del pedido.
public class OrderProcessorService : IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po, string reportOrderStatusTo)
{
Orders.Add(po);
Console.WriteLine("Processing {0} ", po);
Console.WriteLine("Sending back order status information");
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
msmqCallbackBinding.Security.Mode = NetMsmqSecurityMode.None;
OrderStatusClient client = new OrderStatusClient(msmqCallbackBinding, new EndpointAddress(reportOrderStatusTo));
// please note that the same transaction that is used to dequeue purchase order is used
// to send back order status
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
client.OrderStatus(po.PONumber, po.Status);
scope.Complete();
}
}
}
El enlace de cliente que se va a usar se especifica mediante un archivo de configuración.
El nombre de cola de MSMQ se especifica en una sección appSettings del archivo de configuración. El punto de conexión del servicio se define en la sección System.serviceModel del archivo de configuración.
Nota:
El nombre de cola de MSMQ y la dirección de extremo utilizan convenciones de direccionamiento ligeramente diferentes. El nombre de la cola de MSMQ utiliza un punto (.) para el equipo local y separadores con barra diagonal inversa en su ruta de acceso. La dirección de punto de conexión de WCF especifica un esquema net.msmq:, usa el "localhost" para el equipo local y barras diagonales en su ruta de acceso. Para leer de una cola que se hospeda en el equipo remoto, reemplace "." y “localhost” con el nombre del equipo remoto.
Un archivo .svc con el nombre de la clase se usa para hospedar el código de servicio en WAS.
El propio archivo Service.svc contiene una directiva para crear OrderProcessorService.
<%@ServiceHost language="c#" Debug="true" Service="Microsoft.ServiceModel.Samples.OrderProcessorService"%>
El archivo Service.svc también contiene una directiva de ensamblado para asegurarse de que se cargue System.Transactions.dll.
<%@Assembly name="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"%>
El cliente crea un ámbito de transacción. La comunicación con el servicio tiene lugar dentro del ámbito de la transacción, lo que hace que se trate como una unidad atómica en la que todos los mensajes se realicen correctamente o produzcan errores. La transacción se confirma llamando a Complete en el ámbito de la transacción.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderStatusService)))
{
// Open the ServiceHostBase to create listeners and start listening
// for order status messages.
serviceHost.Open();
// Create a proxy with given client endpoint configuration
OrderProcessorClient client = new OrderProcessorClient();
// 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;
//Create a transaction scope.
using (TransactionScope scope = new
TransactionScope(TransactionScopeOption.Required))
{
// Make a queued call to submit the purchase order
client.SubmitPurchaseOrder(po,
"net.msmq://localhost/private/ServiceModelSamplesOrder/OrderStatus");
// Complete the transaction.
scope.Complete();
}
//Closing the client gracefully closes the connection and cleans up
//resources
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
serviceHost.Close();
}
El código de cliente implementa el IOrderStatus contrato para recibir el estado del pedido del servicio. En este caso, imprime el estado del pedido.
[ServiceBehavior]
public class OrderStatusService : IOrderStatus
{
[OperationBehavior(TransactionAutoComplete = true,
TransactionScopeRequired = true)]
public void OrderStatus(string poNumber, string status)
{
Console.WriteLine("Status of order {0}:{1} ",
poNumber , status);
}
}
La cola de estado del pedido se crea en el método Main. La configuración del cliente incluye la configuración del servicio de estado de pedido para hospedar el servicio de estado del pedido, como se muestra en la siguiente configuración de ejemplo.
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="targetQueueName" value=".\private$\ServiceModelSamples/service.svc" />
<add key="responseQueueName" value=".\private$\ServiceModelSamples/OrderStatus" />
</appSettings>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.OrderStatusService">
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamples/OrderStatus"
binding="netMsmqBinding"
contract="Microsoft.ServiceModel.Samples.IOrderStatus" />
</service>
</services>
<client>
<!-- Define NetMsmqEndpoint -->
<endpoint name="OrderProcessorEndpoint"
address="net.msmq://localhost/private/ServiceModelSamples/service.svc"
binding="netMsmqBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
</client>
</system.serviceModel>
Al ejecutar el ejemplo, las actividades de cliente y servicio se muestran en las ventanas de servidor y consola de cliente. Puede ver que el servidor recibe mensajes del cliente. Presione ENTRAR en cada ventana de consola para apagar el servidor y el cliente.
El cliente muestra la información de estado del pedido enviada por el servidor:
Press <ENTER> to terminate client.
Status of order 70cf9d63-3dfa-4e69-81c2-23aa4478ebed :Pending
Para configurar, compilar y ejecutar el ejemplo
Asegúrese de que IIS 7.0 está instalado, ya que es necesario para la activación de WAS.
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation. Además, debe instalar los componentes de activación no HTTP de WCF:
En el menú Inicio , elija Panel de control.
Seleccione Programas y características.
Haga clic en Activar o desactivar características de Windows.
En Resumen de características, haga clic en Agregar características.
Expanda el nodo Microsoft .NET Framework 3.0 y compruebe la característica Activación sin HTTP de Windows Communication Foundation .
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Ejecute el cliente ejecutando client.exe desde una ventana de comandos. Esto crea la cola y envía un mensaje a la misma. Deje el cliente en ejecución para ver el resultado del servicio leyendo el mensaje.
El servicio de activación de MSMQ se ejecuta como servicio de red de forma predeterminada. Por consiguiente, la cola que se utiliza para activar la aplicación debe tener permisos de recepción y lectura para el Servicio de la Red. Esto se puede agregar usando Message Queuing MMC:
En el menú Inicio , haga clic en Ejecutar y escriba
Compmgmt.mscy presione ENTRAR.En Servicios y aplicaciones, expanda Message Queuing.
Haga clic en Colas privadas.
Haga clic con el botón derecho en la cola (servicemodelsamples/Service.svc) y elija Propiedades.
En la pestaña Seguridad , haga clic en Agregar y proporcione permisos de inspección y recepción al servicio de red.
Configure el Servicio de activación de procesos de Windows (WAS) para admitir la activación de MSMQ.
Como comodidad, los pasos siguientes se implementan en un archivo por lotes denominado AddMsmqSiteBinding.cmd ubicado en el directorio de ejemplo.
Para admitir la activación de net.msmq, el sitio web predeterminado debe estar enlazado primero al protocolo net.msmq. Esto se puede hacer mediante appcmd.exe, que se instala con el conjunto de herramientas de administración de IIS 7.0. Desde un terminal con privilegios elevados (administrador), ejecute el siguiente comando.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.msmq',bindingInformation='localhost']Nota:
Este comando es una sola línea de texto.
Este comando agrega una vinculación de sitio net.msmq al sitio Web predeterminado.
Aunque todas las aplicaciones de un sitio comparten un enlace de net.msmq común, cada aplicación puede habilitar la compatibilidad con net.msmq individualmente. Para habilitar net.msmq para la aplicación /servicemodelsamples, ejecute el siguiente comando desde una ventana de comandos con privilegios elevados.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.msmqNota:
Este comando es una sola línea de texto.
Este comando permite acceder a la aplicación /servicemodelsamples mediante
http://localhost/servicemodelsamplesynet.msmq://localhost/servicemodelsamples.
Si no lo ha hecho anteriormente, asegúrese de que el servicio de activación de MSMQ esté habilitado. En el menú Inicio , haga clic en Ejecutar y escriba
Services.msc. Busque la lista de servicios para el Net.Msmq Listener Adapter. Haga clic con el botón secundario y seleccione Propiedades. Establezca el tipo de inicio en Automático, haga clic en Aplicar y haga clic en el botón Inicio . Este paso solo debe realizarse una vez antes del primer uso del servicio Net.Msmq Listener Adapter.Para ejecutar el ejemplo en una configuración de un solo equipo o entre equipos, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation. Además, cambie el código del cliente que envía el pedido de compra para reflejar el nombre del equipo en el URI de la cola al enviar el pedido de compra. Use el código siguiente:
client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");Quite el enlace del sitio de net.msmq que ha agregado para este ejemplo.
Como comodidad, los pasos siguientes se implementan en un archivo por lotes denominado RemoveMsmqSiteBinding.cmd ubicado en el directorio de ejemplo:
Quite net.msmq de la lista de protocolos habilitados ejecutando el comando siguiente desde un símbolo del sistema con permisos elevados.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:httpNota:
Este comando es una sola línea de texto.
Eliminar el enlace del sitio net.msmq ejecutando el siguiente comando desde una línea de comandos con privilegios elevados.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']Nota:
Este comando es una sola línea de texto.
Advertencia
Al ejecutar el archivo por lotes, se restablecerá DefaultAppPool para que se ejecute mediante .NET Framework versión 2.0.
De forma predeterminada, con el transporte de enlace netMsmqBinding, la seguridad está habilitada. Dos propiedades, MsmqAuthenticationMode y MsmqProtectionLevel, determinan juntos el tipo de seguridad de transporte. De forma predeterminada, el modo de autenticación se establece Windows en y el nivel de protección se establece en Sign. Para que MSMQ proporcione la característica de autenticación y firma, debe formar parte de un dominio. Si ejecuta este ejemplo en un equipo que no forma parte de un dominio, se recibe el siguiente error: "El certificado de puesta en cola de mensajes internos del usuario no existe".
Para ejecutar el ejemplo en un equipo unido a un grupo de trabajo
Si el equipo no forma parte de un dominio, desactive la seguridad de transporte estableciendo el modo de autenticación y el nivel de protección en ninguno, como se muestra en la siguiente configuración de ejemplo.
<bindings> <netMsmqBinding> <binding configurationName="TransactedBinding"> <security mode="None"/> </binding> </netMsmqBinding> </bindings>Cambie la configuración tanto en el servidor como en el cliente antes de ejecutar el ejemplo.
Nota:
Establecer
security modeenNonees equivalente a establecer la seguridad deMsmqAuthenticationMode,MsmqProtectionLevelyMessageenNone.Para habilitar la activación en un equipo unido a un grupo de trabajo, tanto el servicio de activación como el proceso de trabajo deben ejecutarse con una cuenta de usuario específica (debe ser la misma para ambos) y la cola debe tener ACL para la cuenta de usuario específica.
Para cambiar la identidad bajo la cual se ejecuta el proceso de trabajo del trabajador:
Ejecute Inetmgr.exe.
En Grupos de aplicaciones, haga clic con el botón derecho en AppPool (normalmente DefaultAppPool) y elija Establecer valores predeterminados del grupo de aplicaciones....
Modifique las propiedades de Identidad para usar la cuenta de usuario específica.
Para cambiar la identidad bajo la cual se ejecuta el Servicio de Activación:
Ejecute Services.msc.
Haga clic con el botón derecho en net.MsmqListener adapter (Adaptador de Net.MsmqListener) y elija Propiedades.
Cambie la cuenta en la pestaña LogOn .
En el grupo de trabajo, el servicio también debe ejecutarse mediante un token sin restricciones. Para ello, ejecute lo siguiente en una ventana de comandos:
sc sidtype netmsmqactivator unrestricted