WebJob не загружает сборку SendGridMail
Я пытаюсь использовать расширения SendGrid для веб-заданий Azure. Я попытался последовать примеру, но, к сожалению, приложение WebJob вылетает со следующей ошибкой:
Не удалось загрузить файл или сборку 'SendGridMail, версия = 6.1.0.0, культура = нейтральная, PublicKeyToken = 2ae73662c35d80e4' или одна из ее зависимостей. Система не может найти указанный файл.
Однажды столкнувшись с чем-то похожим, прежде чем задействовать Json из NewtonSoft, я попытался исправить проблему, добавив в 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>
К сожалению, это не помогло (то же сообщение об ошибке).
Я заметил, что пакет nuget расширения WebJobs SendGrid устанавливает старую версию SendGrid (v6.1). Но я пытаюсь следовать примерам расширений WebJob, и у них есть следующее выражение using:
using SendGrid.Helpers.Mail;
и, к сожалению, пространство имен SendGrid.Helpers.Mail не существует в v6.1 SendGrid.
дополнительные детали
Основываясь на отзывах Тома, я удалил пакет nuget расширений SendGrid и установил необходимые библиотеки «вручную», отредактировав project.json. Это дает мне последнюю стабильную версию каждой из библиотек ... но приложение все равно падает при запуске с той же ошибкой.
Вот код запуска:
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();
}
Я следую примеру SendGrid, изменяя подпись метода в Functions.cs следующим образом:
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 );
}
Если я не выполняю вызов UseSendGrid () в коде запуска приложения, я получаю исключение, когда определение метода является синтаксическим анализом, сообщая, что я обязательно должен использовать UseSendGrid (). Но, как я уже отмечал выше, UseSendGrid () взрывается.
Нет исключений, но нет и электронной почты
Основываясь на примере Тома, я изменил функцию обработки сообщений, чтобы она не использовала параметр out Mail, а просто создал и отправил электронное письмо из тела метода:
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() );
Консольное приложение теперь нормально запускается, а процессор сообщений работает нормально ... но электронная почта не отправляется. Или, скорее, ни один не приходит, и когда я проверяю свою панель мониторинга на SendGrid.com, нет никаких записей о какой-либо активности.
Успех!
Я наконец получил это, чтобы работать. Я считаю, что «последняя» проблема заключалась в том, что я не указывал адрес электронной почты, который я создавал. Как только я это сделал, это сработало как шарм.