Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio MsmqActivation illustra come ospitare applicazioni nel servizio di attivazione dei processi di Windows (WAS) letta da una coda di messaggi. Questo esempio usa netMsmqBinding
e si basa sull'esempio di comunicazioneTwo-Way . Il servizio in questo caso è un'applicazione ospitata sul Web e il client è self-hosted e mostra alla console lo stato degli ordini di acquisto inviati.
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Windows Process Activation Service (WAS), il nuovo meccanismo di attivazione dei processi per Windows Server 2008, fornisce funzionalità simili a IIS precedentemente disponibili solo per le applicazioni basate su HTTP alle applicazioni che usano protocolli non HTTP. Windows Communication Foundation (WCF) usa l'interfaccia dell'adapter listener per comunicare le richieste di attivazione ricevute sui protocolli non HTTP supportati da WCF, ad esempio TCP, Named Pipes e MSMQ. La funzionalità per la ricezione di richieste su protocolli non HTTP è ospitata da servizi Windows gestiti in esecuzione in SMSvcHost.exe.
Il servizio adattatore del listener Net.Msmq (NetMsmqActivator) avvia le applicazioni in attesa basandosi sui messaggi nella coda.
Il client invia ordini di acquisto al servizio dall'ambito di una transazione. Il servizio riceve gli ordini in una transazione e li elabora. Il servizio poi richiama il cliente con lo stato dell'ordine. Per facilitare la comunicazione bidirezionale, il client e il servizio usano entrambi le code per mettere in coda gli ordini di acquisto e lo stato dell'ordine.
Il contratto IOrderProcessor
di servizio definisce le operazioni di servizio unidirezionali che funzionano con l'accodamento. L'operazione del servizio utilizza l'endpoint di risposta per inviare gli stati dell'ordine al cliente. L'indirizzo del endpoint di risposta è l'URI della coda utilizzata per restituire lo stato dell'ordine al client. L'applicazione di elaborazione degli ordini implementa questo contratto.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void SubmitPurchaseOrder(PurchaseOrder po,
string reportOrderStatusTo);
}
Il contratto di risposta a cui inviare lo stato dell'ordine viene specificato dal client. Il cliente esegue il contratto relativo allo stato dell'ordine. Il servizio usa il client generato di questo contratto per inviare di nuovo lo stato dell'ordine al client.
[ServiceContract]
public interface IOrderStatus
{
[OperationContract(IsOneWay = true)]
void OrderStatus(string poNumber, string status);
}
Il servizio processa l'ordine di acquisto inviato.
OperationBehaviorAttribute viene applicato all'operazione del servizio per specificare l'integrazione automatica nella transazione, che viene utilizzata per ricevere automaticamente il messaggio dalla coda e per il completamento automatico della transazione al termine dell'operazione del servizio. La Orders
classe incapsula la funzionalità di elaborazione degli ordini. In questo caso, aggiunge l'ordine di acquisto a un dizionario. La transazione in cui è inclusa l'operazione del servizio è disponibile per le operazioni nella Orders
classe .
L'operazione del servizio, oltre a elaborare l'ordine di acquisto presentato, invia una risposta al cliente sullo stato dell'ordine.
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();
}
}
}
L'associazione client da usare viene specificata usando un file di configurazione.
Il nome della coda MSMQ viene specificato in una sezione appSettings del file di configurazione. L'endpoint per il servizio viene definito nella sezione System.serviceModel del file di configurazione.
Annotazioni
Il nome della coda MSMQ e l'indirizzo dell'endpoint usano convenzioni di indirizzamento leggermente diverse. Il nome della coda MSMQ usa un punto (.) per il computer locale e separatori barra inversa nel percorso. L'indirizzo dell'endpoint WCF specifica uno schema net.msmq:, usa "localhost" per il computer locale e usa le barre oblique nel percorso. Per leggere da una coda ospitata su un computer remoto, sostituire "." e "localhost" con il nome del computer remoto.
Un file con estensione svc con il nome della classe viene usato per ospitare il codice del servizio in WAS.
Il file Service.svc contiene una direttiva per creare l'oggetto OrderProcessorService
.
<%@ServiceHost language="c#" Debug="true" Service="Microsoft.ServiceModel.Samples.OrderProcessorService"%>
Il file Service.svc contiene anche una direttiva assembly per assicurarsi che venga caricato System.Transactions.dll.
<%@Assembly name="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"%>
Il client crea un ambito di transazione. La comunicazione con il servizio avviene all'interno dell'ambito della transazione, causandone la gestione come un'unità atomica in cui tutti i messaggi hanno esito positivo o negativo. La transazione viene confermata chiamando Complete
sull'ambito della transazione.
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();
}
Il codice client implementa il IOrderStatus
contratto per ricevere lo stato dell'ordine dal servizio. In questo caso, stampa lo stato dell'ordine.
[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 coda di stato dell'ordine Main
viene creata nel metodo . La configurazione client include la configurazione del servizio di stato dell'ordine per ospitare il servizio di stato dell'ordine, come illustrato nella configurazione di esempio seguente.
<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>
Quando si esegue l'esempio, le attività client e di servizio vengono visualizzate sia nelle finestre del server che della console client. È possibile visualizzare il server che riceve messaggi dal client. Premere INVIO in ogni finestra della console per arrestare il server e il client.
Il client visualizza le informazioni sullo stato dell'ordine inviate dal server:
Press <ENTER> to terminate client.
Status of order 70cf9d63-3dfa-4e69-81c2-23aa4478ebed :Pending
Per configurare, compilare ed eseguire l'esempio
Assicurarsi che IIS 7.0 sia installato, perché è necessario per l'attivazione WAS.
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation. Inoltre, è necessario installare i componenti di attivazione non HTTP WCF:
Scegliere Pannello di controllo dal menu Start.
Selezionare Programmi e funzionalità.
Fare clic su Attiva o disattiva funzionalità di Windows.
In Riepilogo funzionalità fare clic su Aggiungi funzionalità.
Espandere il nodo Microsoft .NET Framework 3.0 e controllare la funzionalità Attivazione non HTTP di Windows Communication Foundation .
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Eseguire il client eseguendo client.exe da una finestra di comando. In questo modo si crea la coda e si invia un messaggio ad essa. Lasciare il client in esecuzione per visualizzare il risultato del servizio che legge il messaggio
Il servizio di attivazione MSMQ viene eseguito come servizio di rete per impostazione predefinita. Pertanto, la coda usata per attivare l'applicazione deve disporre di autorizzazioni di ricezione e visualizzazione per il servizio di rete. Questo può essere aggiunto utilizzando MMC per l'accodamento messaggi.
Dal menu Start fare clic su Esegui, quindi digitare
Compmgmt.msc
e premere INVIO.In Servizi e applicazioni, espandi Accodamento messaggi.
Fare clic su Code private.
Fare clic con il pulsante destro del mouse sulla coda (servicemodelsamples/Service.svc) e scegliere Proprietà.
Nella scheda Sicurezza fare clic su Aggiungi e dare un'occhiata e ricevere le autorizzazioni per il servizio di rete.
Configurare il servizio di attivazione dei processi windows (WAS) per supportare l'attivazione MSMQ.
Per praticità, i passaggi seguenti vengono implementati in un file batch denominato AddMsmqSiteBinding.cmd che si trova nella directory di esempio.
Per supportare l'attivazione net.msmq, il sito Web predefinito deve prima essere associato al protocollo net.msmq. Questa operazione può essere eseguita usando appcmd.exe, che viene installato con il set di strumenti di gestione IIS 7.0. Da un prompt dei comandi con privilegi elevati (amministratore) eseguire il comando seguente.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.msmq',bindingInformation='localhost']
Annotazioni
Questo comando è una singola riga di testo.
Questo comando aggiunge un'associazione di sito net.msmq al sito Web predefinito.
Anche se tutte le applicazioni all'interno di un sito condividono un'associazione net.msmq comune, ogni applicazione può abilitare singolarmente il supporto net.msmq. Per abilitare net.msmq per l'applicazione /servicemodelsamples, eseguire il comando seguente da un prompt dei comandi con privilegi elevati.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.msmq
Annotazioni
Questo comando è una singola riga di testo.
Questo comando consente di accedere all'applicazione /servicemodelsamples usando
http://localhost/servicemodelsamples
enet.msmq://localhost/servicemodelsamples
.
Se non è stato fatto in precedenza, assicurarsi che il servizio di attivazione MSMQ sia abilitato. Scegliere Esegui dal menu Start e digitare
Services.msc
. Cerca l'elenco dei servizi per Net.Msmq Listener Adapter. Fare clic con il pulsante destro del mouse e selezionare Proprietà. Impostare Tipo di avvio su Automatico, fare clic su Applica e fare clic sul pulsante Start . Questo passaggio deve essere eseguito una sola volta prima del primo utilizzo del servizio Adapter listener Net.Msmq.Per eseguire l'esempio in un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation. Modificare inoltre il codice nel client che invia l'ordine di acquisto in modo da riflettere il nome del computer nell'URI della coda quando si invia l'ordine di acquisto. Usare il codice seguente:
client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");
Rimuovi il binding del sito net.msmq che hai aggiunto per questo esempio.
Per praticità, i passaggi seguenti vengono implementati in un file batch denominato RemoveMsmqSiteBinding.cmd che si trova nella directory di esempio:
Rimuovere net.msmq dall'elenco dei protocolli abilitati eseguendo il comando seguente da un prompt dei comandi con privilegi elevati.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http
Annotazioni
Questo comando è una singola riga di testo.
Rimuovere l'associazione del sito net.msmq eseguendo il comando seguente da un prompt dei comandi con privilegi elevati.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']
Annotazioni
Questo comando è una singola riga di testo.
Avvertimento
L'esecuzione del file batch reimposta defaultAppPool per l'esecuzione con .NET Framework versione 2.0.
Per impostazione predefinita con il binding di trasporto netMsmqBinding
, la sicurezza è abilitata. Due proprietà, MsmqAuthenticationMode
e MsmqProtectionLevel
, insieme determinano il tipo di sicurezza del trasporto. Per impostazione predefinita, la modalità di autenticazione è impostata su Windows
e il livello di protezione è impostato su Sign
. Affinché MSMQ fornisca la funzionalità di autenticazione e firma, deve far parte di un dominio. Se si esegue questo esempio in un computer che non fa parte di un dominio, viene visualizzato l'errore seguente: "Il certificato di accodamento messaggi interno dell'utente non esiste".
Per eseguire l'esempio in un computer aggiunto a un gruppo di lavoro
Se il computer non fa parte di un dominio, disattivare la sicurezza del trasporto impostando la modalità di autenticazione e il livello di protezione su nessuno, come illustrato nella configurazione di esempio seguente.
<bindings> <netMsmqBinding> <binding configurationName="TransactedBinding"> <security mode="None"/> </binding> </netMsmqBinding> </bindings>
Modificare la configurazione sia nel server che nel client prima di eseguire l'esempio.
Annotazioni
L'impostazione di
security mode
suNone
equivale all'impostazione della sicurezza diMsmqAuthenticationMode
,MsmqProtectionLevel
eMessage
suNone
.Per abilitare l'attivazione in un computer aggiunto a un gruppo di lavoro, sia il servizio di attivazione che il processo di lavoro devono essere eseguiti con un account utente specifico (deve essere lo stesso per entrambi) e la coda deve avere elenchi di controllo di accesso per l'account utente specifico.
Per modificare l'identità in cui viene eseguito il processo di lavoro:
Eseguire Inetmgr.exe.
In Pool di applicazioni fare clic con il pulsante destro del mouse sul pool di app (in genere DefaultAppPool) e scegliere Imposta impostazioni predefinite pool di applicazioni....
Modificare le proprietà Identity per usare l'account utente specifico.
Per modificare l'identità in cui viene eseguito il servizio di attivazione:
Eseguire Services.msc.
Fare clic con il pulsante destro del mouse sull'adapter Net.MsmqListener e scegliere Proprietà.
Modificare l'account nella scheda LogOn .
Nel gruppo di lavoro, il servizio deve anche essere eseguito usando un token senza restrizioni. A tale scopo, eseguire quanto segue in una finestra di comando:
sc sidtype netmsmqactivator unrestricted