WebJob no carga el ensamblaje SendGridMail

Estoy tratando de usar las extensiones SendGrid para Azure WebJobs. Intenté seguir el ejemplo, pero, desafortunadamente, la aplicación WebJob se bloquea con el siguiente error:

No se pudo cargar el archivo o ensamblado 'SendGridMail, Version = 6.1.0.0, Culture = neutral, PublicKeyToken = 2ae73662c35d80e4' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

Habiendo encontrado algo similar una vez antes de involucrar a Json de NewtonSoft, intenté solucionar el problema agregando lo siguiente a app.config:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="SendGridMail" publicKeyToken="2ae73662c35d80e4" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

Desafortunadamente, eso no ayudó (mismo mensaje de error).

Noté que el paquete nuget de extensión WebJobs SendGrid instala una versión anterior de SendGrid (v6.1). Pero estoy tratando de seguir los ejemplos de Extensiones de WebJob, y tienen la siguiente declaración de uso:

using SendGrid.Helpers.Mail;

y, desafortunadamente, el espacio de nombres SendGrid.Helpers.Mail no existe en la v6.1 de SendGrid.

Detalles adicionales

Según los comentarios de Tom, desinstalé el paquete nuget de extensiones SendGrid e instalé las bibliotecas necesarias "manualmente" editando project.json. Eso me da la última versión estable de cada una de las bibliotecas ... pero la aplicación aún se bloquea al inicio con el mismo error.

Aquí está el código de inicio:

public static void Main(string[] args)
{
    var config = new JobHostConfiguration()
    {
        NameResolver = new QueueNameResolver( new AzureContext() ),
    };

    if( config.IsDevelopment )
    {
            config.UseDevelopmentSettings();
    }

    config.Tracing.ConsoleLevel = TraceLevel.Info;

    // this is the line where the exception gets thrown
    config.UseSendGrid();

    JobHost host = new JobHost( config );

    host.RunAndBlock();
}

Estoy siguiendo el ejemplo de SendGrid, modificando la firma de un método en Functions.cs de la siguiente manera:

public static void ProcessPhoneFileMessage(
        [QueueTrigger( "%" + nameof( ContainerQueueConstants.PhoneFiles ) + "%" )] AgencyOutreachMessage msg,
        [SendGrid] out Mail message
        )
{
    StringWriter swLogger = new StringWriter();

    try
    {
        GeneratePhoneFileJob fmJob = new GeneratePhoneFileJob( swLogger, msg );

        fmJob.Execute();
    }
    catch( Exception e )
    {
        swLogger.WriteLine( $"{nameof( GeneratePhoneFileJob )} triggered an exception, message was: {e.Message}" );
    }

    message = new Mail();

    message.Subject = "Phone File Job";
    message.AddContent( new Content( "text/plain", "Completed the Phone File Job" ) );
    message.AddContent( new Content( "text/plain", swLogger.ToString() ) );

    Personalization personalization = new Personalization();
    personalization.AddTo(new Email("[email protected]", "Mark Olbert") );
    message.AddPersonalization( personalization );
}

Si no hago la llamada a UseSendGrid () en el código de inicio de la aplicación, obtengo una excepción cuando se analiza la definición del método y me dice que me asegure de llamar a UseSendGrid (). Pero, como señalé anteriormente, UseSendGrid () explota.

Sin excepción, pero tampoco correo electrónico

Basado en el ejemplo de Tom, modifiqué la función de procesamiento de mensajes para que no utilizara un parámetro de Correo, y simplemente construí y envié el correo electrónico desde el cuerpo del método:

SendGridAPIClient sg = new SendGridAPIClient( "redacted" );
Mail message = new Mail();

message.Subject = "Phone File Job";
message.AddContent( new Content( "text/plain", "Completed the Phone File Job" ) );
message.AddContent( new Content( "text/plain", swLogger.ToString() ) );

Personalization personalization = new Personalization();
personalization.AddTo(new Email("redacted", "Mark Olbert") );
message.AddPersonalization( personalization );

sg.client.mail.send.post( requestBody: message.Get() );

La aplicación de consola ahora se inicia bien y el procesador de mensajes funciona bien ... pero no se envía ningún correo electrónico. O, más bien, no llega ninguno, y cuando reviso mi tablero en SendGrid.com no hay registro de ninguna actividad.

¡Éxito!

Finalmente conseguí que esto funcione. Creo que el problema "final" fue que me había olvidado de incluir una dirección De para el correo electrónico que estaba creando. Una vez que hice eso, funcionó a las mil maravillas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta