Uso de operaciones asíncronas en EWSClient
A diferencia de los métodos síncronos, los métodos asíncronos son no bloqueantes y permiten realizar múltiples solicitudes simultáneamente. Los métodos asíncronos se nombran con el sufijo Async.
NOTA: Los métodos Async están disponibles en versiones que apunten a .NET Core, .NET Framework 4.5 y posteriores.
Implementando IAsyncTokenProvider para obtener tokens OAuth de forma asíncrona
El siguiente ejemplo de código define una clase SomeAsyncTokenProvider, que implementa la interfaz IAsyncTokenProvider. La clase implementa el método asíncrono GetAccessTokenAsync que devuelve un Task de tipo OAuthToken. Este método obtiene un OAuthToken válido de forma asíncrona.
private class SomeAsyncTokenProvider : IAsyncTokenProvider
{
public SomeAsyncTokenProvider( /*algunos parámetros*/)
{
...
}
public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false,
CancellationToken cancellationToken = default)
{
//Algún código asíncrono para obtener un OAuthToken válido
...
}
public void Dispose()
{
...
}
}
Creando la instancia IAsyncEwsClientInstance
El siguiente ejemplo de código obtiene un cliente de Exchange Web Services (EWS) de forma asíncrona utilizando autenticación OAuth. El código realiza los siguientes pasos:
- Crea un nuevo objeto CancellationToken que puede usarse para cancelar operaciones asíncronas.
- Instancia la clase
SomeAsyncTokenProviderque implementa la interfaz IAsyncTokenProvider. Esta clase se utiliza como un parámetro para construir un nuevo objeto OAuthNetworkCredential. - Establece la URI del buzón en el extremo de Exchange Web Services.
- Llama al método GetEwsClientAsync de la clase EWSClient con la
mailboxUriy el objetoOAuthNetworkCredentialcomo parámetros. Este método devuelve un objeto Task, por lo que espera el resultado antes de continuar. El objetocancellationTokense pasa como un parámetro opcional al método GetEwsClientAsync.
//El cancellationToken puede ser usado
var cancellationToken = new CancellationToken();
//Crear IAsyncEwsClientInstance
IAsyncTokenProvider tokenProvider = new SomeAsyncTokenProvider(/*algunos parámetros*/);
const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
var ewsClient = await EWSClient.GetEwsClientAsync(mailboxUri, new OAuthNetworkCredential(tokenProvider),
cancellationToken: cancellationToken);
Enviando un mensaje
El siguiente ejemplo de código intenta enviar un mensaje de correo electrónico de forma asíncrona. El código realiza los siguientes pasos:
- Crea un nuevo objeto MailMessage con los parámetros del mensaje.
- Llama al método SendAsync del objeto EWSClient, pasando el MailMessage como parámetro. El método se espera ya que devuelve un objeto Task. El objeto
cancellationTokense pasa como un parámetro opcional al método SendAsync.
MailMessage message = new MailMessage("from@aspose.com", "to@aspose.com", "Algun asunto", "Algun cuerpo");
await ewsClient.SendAsync(message, cancellationToken: cancellationToken);
Recuperando un mensaje con archivos adjuntos
Para recuperar un mensaje de correo electrónico de manera asíncrona, utiliza el siguiente ejemplo de código con los pasos descritos a continuación:
-
Llama al método FetchItemAsync de un EWSclient. El método toma dos parámetros:
messageUries una cadena que representa la URI del mensaje a recuperarcancellationTokenes un parámetro opcional que se puede utilizar para cancelar la operación asíncrona. El método devuelve un objeto Task que se resuelve en un objeto MapiMessage cuando la operación asíncrona se completa. La palabra clave “await” se utiliza para esperar que el objeto Task complete antes de proceder.
-
Asigna a la variable
fetchedel resultado de la tarea completada, que es un objeto MapiMessage que contiene los datos del mensaje recuperado.var fetched = await ewsClient.FetchItemAsync(messageUri, cancellationToken: cancellationToken);
Agregando mensajes
El siguiente ejemplo de código intenta agregar mensajes de correo electrónico de forma asíncrona. El código realiza los siguientes pasos:
-
Llama al método AppendMessagesAsync del objeto EWSclient. El método toma un objeto EwsAppendMessage que contiene parámetros: los mensajes a agregar, la URI de la carpeta de destino y el token de cancelación.
-
Crea el objeto EwsAppendMessage utilizando el método Create y lo configura con las siguientes llamadas de método:
- AddMessage agrega un mensaje a la operación de agregar.
- SetFolder establece la URI de la carpeta de destino para la operación de agregar.
- SetCancellationToken establece el token de cancelación que se puede utilizar para cancelar la operación asíncrona.
-
El método AppendMessagesAsync devuelve un objeto Task que se resuelve en un objeto IEnumerable
cuando la operación asíncrona se completa. La palabra clave “await” se usa para esperar que el objeto Task complete antes de continuar. -
La variable
urisse asigna al resultado de la tarea completada, que es un objeto IEnumerableque contiene las URIs de los mensajes agregados.
IEnumerable<string> uris = await ewsClient.AppendMessagesAsync(
EwsAppendMessage.Create()
.AddMessage(message)
.AddMessage(fetched)
.SetFolder(folderUri)
.SetCancellationToken(cancellationToken));
Copiando elementos
El siguiente ejemplo de código muestra cómo copiar elementos y realiza los siguientes pasos:
-
Llama al método CopyItemAsync del objeto EWSClient. El método toma tres parámetros:
messageUries una cadena que representa la URI del mensaje a copiardestinationFolderUries una cadena que representa la URI de la carpeta de destinocancellationTokenes un parámetro opcional que se puede utilizar para cancelar la operación asíncrona.
El método devuelve un objeto Task que se resuelve en una cadena cuando la operación asíncrona se completa. La palabra clave “await” se usa para esperar que el objeto Task complete antes de continuar.
-
La variable
newItemUrise asigna al resultado de la tarea completada, que es una cadena que contiene la URI de la copia recién creada del mensaje.
string newItemUri = await ewsClient.CopyItemAsync(messageUri, destinationFolderUri, cancellationToken);
Eliminando elementos
El siguiente código intenta eliminar un mensaje de correo electrónico de forma asíncrona.
Llama al método DeleteItemAsync del objeto EWSClient. El método toma tres parámetros:
newItemUries una cadena que representa la URI del elemento a eliminarDeletionOptions.DeletePermanentlyespecifica que el elemento debe eliminarse permanentementecancellationTokenes un parámetro opcional que se puede utilizar para cancelar la operación asíncrona.
El método devuelve un objeto Task que se completa cuando la operación asíncrona se completa. La palabra clave “await” se usa para esperar que el objeto Task complete antes de continuar.
await ewsClient.DeleteItemAsync(newItemUri, DeletionOptions.DeletePermanently, cancellationToken);
Eliminando carpetas
El siguiente código intenta eliminar una carpeta de forma asíncrona.
Llama al método DeleteFolderAsync del objeto EWSClient. El método toma tres parámetros:
folderUries una cadena que representa la URI de la carpeta a eliminardeletePermanentlyespecifica si se debe eliminar la carpeta permanentemente o moverla a la carpeta “Elementos Eliminados”cancellationTokenes un parámetro opcional que se puede utilizar para cancelar la operación asíncrona.
El método devuelve un objeto Task que se completa cuando la operación asíncrona se completa. La palabra clave “await” se usa para esperar que el objeto Task complete antes de continuar.
const bool deletePermanently = true;
await ewsClient.DeleteFolderAsync(folderUri, deletePermanently, cancellationToken);
Actualizando elementos
El siguiente ejemplo de código intenta actualizar un elemento de forma asíncrona. Realiza los siguientes pasos:
- Crea un objeto EwsUpdateItem utilizando el método Create, pasando un objeto de elemento. El EwsUpdateItem representa los parámetros de la operación de actualización. Se llama al método SetCancellationToken en el objeto EwsUpdateItem, pasando el parámetro
cancellationToken, que es un parámetro opcional que se puede usar para cancelar la operación asíncrona. - Pasa el objeto EwsUpdateItem como un parámetro al método UpdateItemAsync de un EWSClient.
- El método UpdateItemAsync devuelve un objeto Task que se completa cuando la operación asíncrona se completa. La palabra clave “await” se usa para esperar que el objeto Task complete antes de continuar.
await ewsClient.UpdateItemAsync(
EwsUpdateItem.Create(mapiNote)
.SetCancellationToken(cancellationToken));