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:

  1. Crea un nuevo objeto CancellationToken que puede usarse para cancelar operaciones asíncronas.
  2. Instancia la clase SomeAsyncTokenProvider que implementa la interfaz IAsyncTokenProvider. Esta clase se utiliza como un parámetro para construir un nuevo objeto OAuthNetworkCredential.
  3. Establece la URI del buzón en el extremo de Exchange Web Services.
  4. Llama al método GetEwsClientAsync de la clase EWSClient con la mailboxUri y el objeto OAuthNetworkCredential como parámetros. Este método devuelve un objeto Task, por lo que espera el resultado antes de continuar. El objeto cancellationToken se 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:

  1. Crea un nuevo objeto MailMessage con los parámetros del mensaje.
  2. 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 cancellationToken se 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:

  1. Llama al método FetchItemAsync de un EWSclient. El método toma dos parámetros:

    • messageUri es una cadena que representa la URI del mensaje a recuperar
    • cancellationToken es 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.
  2. Asigna a la variable fetched el 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:

  1. 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.

  2. 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.
  3. 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.

  4. La variable uris se asigna al resultado de la tarea completada, que es un objeto IEnumerable que 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:

  1. Llama al método CopyItemAsync del objeto EWSClient. El método toma tres parámetros:

    • messageUri es una cadena que representa la URI del mensaje a copiar
    • destinationFolderUri es una cadena que representa la URI de la carpeta de destino
    • cancellationToken es 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.

  2. La variable newItemUri se 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:

  • newItemUri es una cadena que representa la URI del elemento a eliminar
  • DeletionOptions.DeletePermanently especifica que el elemento debe eliminarse permanentemente
  • cancellationToken es 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:

  • folderUri es una cadena que representa la URI de la carpeta a eliminar
  • deletePermanently especifica si se debe eliminar la carpeta permanentemente o moverla a la carpeta “Elementos Eliminados”
  • cancellationToken es 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:

  1. 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.
  2. Pasa el objeto EwsUpdateItem como un parámetro al método UpdateItemAsync de un EWSClient.
  3. 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));