porta management azure sendgrid azure-webjobs

login azure management portal



WebJob no carga el ensamblado SendGridMail (1)

Intente utilizar el código mydemo. Uso la biblioteca WebJobs.Extensions.SendGrid , la he probado. Funciona con éxito en WebJob después de publicar en WebApp. El siguiente es mi código de prueba y el archivo package.config:

using System; using System.Threading.Tasks; using SendGrid.Helpers.Mail; using SendGrid; namespace TestWebJob { class Program { static void Main(string[] args) { Console.WriteLine($"Start to run the Execute"); Execute().Wait(); Console.WriteLine($"Task finished"); } static async Task Execute() { string apiKey = "your sendgrid API key"; dynamic sg = new SendGridAPIClient(apiKey); Email from = new Email("[email protected]");//a test email address string subject = "Hello World from the SendGrid CSharp Library!"; Email to = new Email("[email protected]");// another test email address Content content = new Content("text/plain", "Hello, Email!"); Mail mail = new Mail(from, subject, to, content); dynamic response = await sg.client.mail.send.post(requestBody: mail.Get()); } } }

El archivo packages.config es el siguiente:

<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> <package id="Microsoft.Azure.WebJobs" version="1.1.1" targetFramework="net452" /> <package id="Microsoft.Azure.WebJobs.Core" version="1.1.1" targetFramework="net452" /> <package id="Microsoft.Azure.WebJobs.Extensions" version="1.0.1" targetFramework="net452" /> <package id="Microsoft.Azure.WebJobs.Extensions.SendGrid" version="1.0.1" targetFramework="net452" /> <package id="Microsoft.Data.Edm" version="5.6.2" targetFramework="net452" /> <package id="Microsoft.Data.OData" version="5.6.2" targetFramework="net452" /> <package id="Microsoft.Data.Services.Client" version="5.6.2" targetFramework="net452" /> <package id="Microsoft.Tpl.Dataflow" version="4.5.24" targetFramework="net452" /> <package id="Microsoft.Web.WebJobs.Publish" version="1.0.12" targetFramework="net452" /> <package id="Microsoft.WindowsAzure.ConfigurationManager" version="1.8.0.0" targetFramework="net452" /> <package id="ncrontab" version="2.0.0" targetFramework="net452" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" /> <package id="Sendgrid" version="8.0.5" targetFramework="net452" /> <package id="SendGrid.CSharp.HTTP.Client" version="3.0.0" targetFramework="net452" /> <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net452" /> <package id="System.Spatial" version="5.6.2" targetFramework="net452" /> <package id="WindowsAzure.Storage" version="4.3.0" targetFramework="net452" /> </packages>

Estoy tratando de usar las extensiones SendGrid para Azure WebJobs. Intenté seguir el ejemplo pero, lamentablemente, 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 topado con algo similar una vez antes de involucrar a NewtonSoft''s Json, 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ó (el 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 v6.1 de SendGrid.

Detalles adicionales

En base a 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 cuelga al arrancar 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, recibo una excepción cuando se analiza la definición del método, diciéndome que me asegure de llamar a UseSendGrid (). Pero, como señalé anteriormente, UseSendGrid () explota.

Sin excepciones, pero sin 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 la consola ahora se inicia correctamente y el procesador de mensajes funciona bien ... pero no se envía ningún correo electrónico. O, mejor dicho, ninguno llega, y cuando reviso mi panel en SendGrid.com no hay registro de ninguna actividad.

¡Éxito!

Finalmente conseguí que esto funcionara. Creo que el problema "final" fue que no incluí una dirección de origen para el correo electrónico que estaba creando. Una vez que hice eso, funcionó como un encanto.