Trasporto posta WCF per Exchange Server

Aggiornamento: novembre 2007

Il trasporto posta Windows Communication Foundation (WCF) per Microsoft Exchange Server fornisce un servizio in coda mediante endpoint WCF basati su indirizzi di posta elettronica. La soluzione consente ad applicazioni .NET Compact Framework e .NET Framework di ospitare e utilizzare servizi Web da qualsiasi computer, purché il server di posta elettronica sia raggiungibile.

Nota:

WCF è supportato in .NET Compact Framework 3.5 e versioni successive.

Questa funzionalità può essere utilizzata per attivare diversi scenari di applicazioni, tra cui:

  • Applicazioni che intendono rinviare comunicazioni protette dal campo a un server centrale e ricevere comunicazioni protette dal server.

  • Applicazioni che effettuano il push dei dati da un server Enterprise ai dispositivi nel campo.

  • Applicazioni peer-to-peer in cui due o più dispositivi possono dialogare direttamente l'uno con l'altro.

    In questi scenari, più parti sono in grado di comunicarsi reciprocamente informazioni relative allo stato utilizzando il server di posta elettronica come mediatore. In un tipico scenario di gioco, ad esempio, un giocatore invia un invito a giocare agli altri giocatori fornendo all'applicazione i relativi indirizzi di posta elettronica o un alias di gruppo.

  • Applicazioni in grado di individuare dispositivi persi.

  • Applicazioni che aggiornano le informazioni di configurazione per altre applicazioni effettuando il push dei dati al dispositivo.

Il trasporto posta WCF per Exchange Server risolve due limitazioni di base dei dispositivi nel campo: l'indirizzabilità e la possibilità di mettere in coda i dati quando i dispositivi non sono in linea. Il nome del canale e l'indirizzo di posta elettronica costituiscono l'indirizzo dell'endpoint WCF. Quest'ultimo è simile a un indirizzo IP con numero di porta di un'applicazione basata su socket. L'indirizzabilità del dispositivo viene gestita dall'indirizzo di posta elettronica, mentre l'indirizzabilità dell'istanza dell'applicazione viene gestita tramite il nome del canale di ingresso. Il protocollo WS-Addressing viene utilizzato per implementare tale schema di indirizzamento personalizzato.

L'accodamento è supportato mediante l'archivio dati locale nei dispositivi basati su Windows Mobile. Per informazioni generali sulle code WCF, vedere Panoramica delle code.

Le applicazioni basate sul trasporto posta WCF per Exchange Server usufruiscono delle funzionalità fondamentali di WCF. WCF fornisce un modello di programmazione unificato per vari protocolli e trasporti sottostanti e separa la logica dell'applicazione dall'endpoint WCF. Tale modello di programmazione offre alcuni vantaggi, incluso il supporto di reti diverse quali General Packet Radio Service (GPRS), Wi-Fi e qualsiasi altra rete in grado di accedere al server di posta elettronica. Lo sviluppo di applicazioni mediante il trasporto posta WCF per Exchange Server è molto simile allo sviluppo di applicazioni mediante canali WCF, ad esempio il canale HTTP.

Requisiti

Il server di posta elettronica per applicazioni basate sul trasporto posta WCF è Exchange Server 2007. Exchange Server 2007 Service Pack 1 offre un'attività amministrativa che consente di reindirizzare il traffico del servizio in una cartella separata per la posta elettronica WCF.

Nota:

Senza il reindirizzamento, il traffico del servizio utilizza la cartella Posta in arrivo.

Il trasporto posta è supportato nei dispositivi mobili e nei computer desktop.

Per il supporto dell'accodamento nel dispositivo, è necessario disporre della CE Messaging API (CEMAPI). La CEMAPI è presente nei dispositivi basati su Windows Mobile, ma non in quelli basati su Windows Embedded CE.

Windows Mobile 5.0 e le versioni successive supportano il trasporto posta WCF per Exchange Server. Nelle versioni di Windows Mobile precedenti alla versione 5.0 (build 14847.2.0), viene utilizzato Systems Management Server (SMS) anziché Direct Push per forzare la sincronizzazione con il server di posta elettronica Exchange.

Nota:

Il trasporto posta è supportato anche in Windows Mobile 2003 per Pocket PC e Windows Mobile 2003 Second Edition per Pocket PC. Per i dispositivi che eseguono versioni di Windows Mobile precedenti alla 5.0, tuttavia, il periodo di sincronizzazione ActiveSync per i messaggi in arrivo non avviene sempre quando pianificato. Per tali dispositivi, quando viene chiamato il metodo Receive è consigliabile specificare un timeout molto lungo o non specificarlo affatto. Windows Mobile 2003 per Smartphone non è supportato.

  • Nei computer desktop, la comunicazione con il server di posta elettronica avviene direttamente tramite i servizi Web di Exchange Server 2007. I computer desktop non supportano l'accodamento e, di conseguenza, devono essere sempre in linea.

  • Le applicazioni in esecuzione su computer desktop utilizzano l'implementazione desktop di WCF.

Architettura

Il livello di messaggistica è basato sull'architettura WCF desktop standard. Il livello di runtime del servizio non è presente. Nell'illustrazione riportata di seguito vengono mostrati lo stack di canale, i protocolli supportati e gli elementi di associazione.

Livello di messaggistica del trasporto posta WCF per Exchange Server

Livello messaggistica per il trasporto posta di Exchange Server

Il supporto della specifica WS-Security versione 1.0 include la sicurezza dei messaggi SOAP mediante i certificati X.509.

La classe Message viene compilata in base alla specifica WS-Addressing. Tutti i messaggi sono asincroni e passano da un dispositivo a un altro attraverso il server di posta elettronica, senza tornare indietro.

Le operazioni di serializzazione e deserializzazione dei messaggi vengono gestite all'interno del runtime di .NET Compact Framework o di .NET Framework. L'applicazione utilizzata nei dispositivi mobili necessita di un serializzatore personalizzato. Nei computer desktop, invece, la versione completa di .NET Framework supporta la classe DataContractSerializer. Se, tuttavia, l'applicazione supporta la comunicazione tra dispositivo e desktop, sarà necessario utilizzare nel computer desktop lo stesso serializzatore utilizzato per il dispositivo mobile.

Progettazione

Nel trasporto posta WCF per Exchange Server, un endpoint WCF è rappresentato dalla combinazione di un'associazione WCF e dell'indirizzo dell'endpoint. L'associazione specifica i parametri utilizzati per la comunicazione. Rappresenta un insieme di elementi di associazione che include un elemento di associazione del trasporto, un elemento di associazione della codifica e un elemento di associazione della sicurezza. Per le applicazioni che utilizzano il trasporto posta, tali elementi sono definiti come segue:

Anziché creare un'istanza di un insieme di elementi di associazione all'interno di un oggetto CustomBinding, le applicazioni sono in grado di creare un insieme predefinito di elementi di associazione utilizzando una classe derivata dall'oggetto MailBindingBase. In aggiunta all'elemento di associazione del trasporto posta, tale classe include un elemento di associazione della codifica testo e la sicurezza dei messaggi facoltativa.

I messaggi vengono inclusi nel corpo del messaggio di posta elettronica o inviati come allegato. La riga Oggetto del messaggio contiene il nome del canale. Il messaggio viene identificato mediante un indicatore personalizzato del canale di posta elettronica WCF fornito dalla classe del messaggio utilizzata da Exchange Server.

Invio di messaggi

Quando un'applicazione invia un messaggio chiama il metodo Send sul canale di output corrente, che deve essere aperto. Il canale di output serializza il messaggio in una stringa e crea il messaggio nella cartella Bozze. I valori appropriati vengono impostati nei campi di posta elettronica. Una volta creato, il messaggio viene spostato nella cartella Posta in uscita. L'operazione avviene mediante la CEMAPI nei dispositivi, mentre nei computer desktop avviene mediante i Servizi Web Exchange. Nei dispositivi mobili, i messaggi presenti nella cartella Posta in uscita vengono sincronizzati con altri messaggi in uscita nelle modalità definite da ActiveSync.

Ricezione di messaggi

Quando un'applicazione basata sul trasporto posta WCF per Exchange Server riceve un messaggio, si verifica quanto segue:

  1. L'applicazione apre il canale di ingresso.

  2. Il canale di ingresso chiama il metodo Receive per porsi in ascolto dei messaggi.

  3. I messaggi dotati di indicatore del canale di posta elettronica WCF ricevuti dal server di posta elettronica Exchange vengono indirizzati automaticamente nella cartella Posta elettronica, allo stesso livello della Posta in arrivo.

    Nota:

    Se il server di posta elettronica Exchange non è stato configurato per il reindirizzamento della posta WCF per Exchange Server nella cartella Posta elettronica, viene invece utilizzata la cartella Posta in arrivo.

  4. Il canale di ingresso rimasto in ascolto del nuovo evento di posta controlla ogni messaggio in arrivo nella cartella Posta elettronica o nella cartella Posta in arrivo.

    Il canale di ingresso blocca il codice mentre rimane in ascolto dei messaggi.

  5. Se il canale di ingresso corrisponde al nome del canale specifico contenuto nel messaggio, recupera il messaggio e sblocca il codice.

È possibile chiamare il metodo Receive per più canali di ingresso basati sullo stesso trasporto. Il blocco si verifica unicamente quando il metodo Receive viene chiamato per la seconda volta sullo stesso canale di ingresso dello stesso thread.

Nota:

A ciascun listener del canale può essere associato soltanto un canale di ingresso. Una seconda chiamata al metodo AcceptChannel su un listener del canale non avrà effetto fino alla chiusura del primo canale di ingresso.

Per una maggiore flessibilità, è possibile configurare il trasporto posta per la gestione di messaggi di varie dimensioni in diversi modi. In base alle dimensioni, ad esempio, i messaggi possono essere inviati come allegati o nel corpo del messaggio. È possibile che i messaggi di grandi dimensioni non vengano scaricati completamente durante la sincronizzazione iniziale. Nei dispositivi mobili, i messaggi presenti nella cartella Posta elettronica o nella cartella Posta in arrivo vengono sincronizzati con altri messaggi in arrivo, come previsto da Microsoft ActiveSync.

Nota:

Nei dispositivi, le impostazioni di sincronizzazione della posta elettronica di ActiveSync controllano la dimensione massima di ogni messaggio inizialmente scaricato nel dispositivo. Se un messaggio supera la dimensione massima, inizialmente viene scaricata solo una parte del corpo del messaggio. Se un messaggio viene scaricato parzialmente e un listener del canale è in attesa del messaggio, il messaggio viene contrassegnato dal trasporto per indicare che deve essere scaricato per intero. Il messaggio completo verrà scaricato alla sessione di sincronizzazione successiva.

Alla ricezione di un messaggio, è possibile ottenere l'indirizzo di posta elettronica del mittente utilizzando la proprietà personalizzata FromEmailAddress nella classe Message. Nell'esempio riportato di seguito viene illustrato come utilizzare tale proprietà.

System.ServiceModel.Channels.Message m;
String senderAddress;
m = input.Receive();
senderAddress = m.Properties.ContainsKey("FromEmailAddress")

Eliminazione di messaggi

Il trasporto elimina un messaggio non appena questo viene richiesto e ricevuto dall'applicazione. Il processo di eliminazione dei messaggi in arrivo dopo la loro elaborazione cambia a seconda della piattaforma in uso.

Il processo di eliminazione dei messaggi in arrivo nei dispositivi basati su Windows Mobile è costituito dai passaggi seguenti:

  1. Il canale di ingresso recupera un messaggio dopo la chiamata al metodo Receive.

  2. Il trasporto posta genera una chiamata per eliminare il messaggio dall'archivio messaggi del dispositivo basato su Windows Mobile.

  3. Il messaggio verrà eliminato dal server alla successiva sincronizzazione della posta elettronica.

Il processo di eliminazione dei messaggi in arrivo nei computer desktop è costituito dai passaggi seguenti:

  1. Il canale di ingresso recupera un messaggio dopo la chiamata al metodo Receive.

  2. Il trasporto posta inserisce il messaggio nella cache dei messaggi eliminati, una cache interna di proprietà del trasporto posta.

  3. Al successivo intervallo di query, la cache dei messaggi eliminati viene controllata dal trasporto posta.

    L'intervallo di query è determinato dalla proprietà ServerQueryInterval.

  4. Se la cache dei messaggi eliminati contiene messaggi, il trasporto posta genera una query che include un comando destinato al server per l'eliminazione dei messaggi nella cache.

  5. Durante la query, il trasporto posta controlla gli eventi server e scarica gli eventuali messaggi associati.

  6. Il trasporto posta invia i messaggi scaricati alla cache di elaborazione affinché vengano elaborati dall'applicazione.

Per i computer desktop, nelle circostanze indicate di seguito il trasporto posta invia anche un comando al server per l'eliminazione dei messaggi salvati nella cache dei messaggi eliminati:

  • Quando il metodo Close viene chiamato sull'ultimo canale di ingresso rimasto aperto e associato a un trasporto posta.

  • Quando il metodo Dispose viene chiamato sul trasporto posta.

Le operazioni sono sincrone. Close e Dispose bloccano il codice fino a eliminare i messaggi dal server. Il tempo necessario all'eliminazione dei messaggi può variare e dipende dal numero di messaggi da eliminare. Se si verifica un errore durante questo processo, il trasporto effettua molti più tentativi di eliminazione dei messaggi.

Nei dispositivi basati su Windows Mobile, la funzione viene gestita dall'archivio messaggi.

I messaggi vengono eliminati anche quando non sono validi o corretti. Un messaggio con un envelope SOAP danneggiato viene considerato non valido e verrà eliminato in modo permanente. Se la riga dell'oggetto del messaggio contiene informazioni errate dopo l'indicatore del canale di posta elettronica WCF, ad esempio un carattere non supportato nel nome del canale, il messaggio viene considerato non corretto. I messaggi non corretti vengono spostati nella cartella Eliminato.

Impostazioni predefinite

La classe MailBindingBase e le classi da essa derivate rappresentano un insieme di elementi di associazione predefiniti. Tali classi sono state progettate per semplificare la creazione di canali di input e di output. In alcuni scenari potrebbe essere necessario modificare i valori predefiniti di tali insiemi predefiniti. Se la proprietà che si desidera modificare non esiste in MailBindingBase o nella classe derivata che si sta utilizzando, è possibile creare separatamente l'elemento di associazione in un oggetto CustomBinding. In alternativa, è possibile chiamare il metodo CreateBindingElements per restituire tutti gli elementi di associazione in MailBindingBase.

Nella classe ExchangeWebServiceMailBinding, ad esempio, la dimensione massima predefinita per i messaggi ricevuti è di 65.536 byte. È possibile aumentare la dimensione massima a 100.000 byte utilizzando il codice riportato di seguito per impostare la proprietà MaxReceivedMessageSize.

binding = new ExchangeWebServiceMailBinding(Server, Credential, MailSecurityMode.Message);
bindingElems = binding.CreateBindingElements();
bindingElems.Find<ExchangeWebServiceMailTransportBindingElement>().MaxReceivedMessageSize = 100000;
binding = new CustomBinding(bindingElems);

Sicurezza

Le applicazioni basate sul trasporto posta WCF per Exchange Server supportano la sicurezza dei messaggi SOAP basata sul protocollo WS-Security, che è simile alle funzionalità di sicurezza desktop supportate per la classe HttpTransportBindingElement. Tale funzionalità di sicurezza si basa sui certificati X.509.

Se si utilizza l'insieme predefinito di elementi di associazione in una sottoclasse dell'oggetto MailBindingBase, la sicurezza dei messaggi è disponibile ma disattivata per impostazione predefinita. Per attivare la sicurezza, utilizzare la proprietà Mode. Per modificare l'algoritmo di crittografia predefinito, utilizzare la proprietà AlgorithmSuite. Una volta attivata la funzionalità di sicurezza, il valore predefinito è Basic256Rsa15.

Gli elementi di associazione della sicurezza supportati nelle applicazioni che utilizzano il trasporto posta WCF per Exchange Server sono SecurityBindingElement e AsymmetricSecurityBindingElement.

Nota:

L'utilizzo della sicurezza dei messaggi aumenta la dimensione dei singoli messaggi. Se si utilizza la classe ExchangeWebServiceMailBinding e la dimensione dei messaggi supera i 45.000 byte, può essere necessario aumentare il valore della proprietà MaxReceivedMessageSize. Nell'esempio di codice riportato nella sezione precedente viene illustrato come aumentare la dimensione massima dei messaggi.

Distribuzione

Per la distribuzione su dispositivi mobili, le DLL del trasporto posta WCF per Exchange Server vengono recapitate nei file CAB di .NET Compact Framework per dispositivi basati su Windows Mobile. Gli assembly gestiti vengono installati nella Global Assembly Cache.

Le DLL del trasporto posta per i dispositivi sono:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll

  • Il wrapper CEMAPI nativo Netcfmail3_5.dll

Nel dispositivo devono essere presenti anche le DLL WCF di .NET Compact Framework.

La distribuzione sui computer desktop viene gestita mediante il file di installazione msi di .NET Compact Framework. La funzionalità di trasporto posta WCF per Exchange Server viene installata per impostazione predefinita. Gli assembly del trasporto posta vengono installati nella Global Assembly Cache del desktop.

Le DLL del trasporto posta WCF per Exchange Server per computer desktop sono:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll

Nel computer desktop devono essere presenti anche le DLL WCF desktop standard.

Vedere anche

Attività

Procedura dettagliata: utilizzo del trasporto posta WCF per Exchange Server

Altre risorse

Sviluppo di Windows Communication Foundation (WCF) e .NET Compact Framework