【问题标题】:WebJob Not Loading SendGridMail AssemblyWebJob 未加载 SendGridMail 程序集
【发布时间】:2016-10-27 04:26:19
【问题描述】:

我正在尝试为 Azure WebJobs 使用 SendGrid 扩展。我尝试按照示例进行操作,但不幸的是,WebJob 应用程序崩溃并出现以下错误:

无法加载文件或程序集'SendGridMail,版本=6.1.0.0, Culture=neutral, PublicKeyToken=2ae73662c35d80e4' 或其之一 依赖项。系统找不到指定的文件。

在涉及 NewtonSoft 的 Json 之前遇到过类似的事情,我尝试通过将以下内容添加到 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>

很遗憾,这没有帮助(同样的错误消息)。

我注意到 WebJobs SendGrid 扩展 nuget 包安装了旧版本的 SendGrid (v6.1)。但我正在尝试遵循 WebJob Extensions 示例,它们具有以下 using 语句:

using SendGrid.Helpers.Mail;

不幸的是,SendGrid v6.1 中不存在 SendGrid.Helpers.Mail 命名空间。

其他详情

根据 Tom 的反馈,我卸载了 SendGrid 扩展 nuget 包,并通过编辑 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("mark@arcabama.com", "Mark Olbert") );
    message.AddPersonalization( personalization );
}

如果我不在应用程序启动代码中调用 UseSendGrid(),则在解析方法定义时会出现异常,告诉我一定要调用 UseSendGrid()。但是,正如我上面提到的,UseSendGrid() 爆炸了。

没有例外,但也没有电子邮件

基于 Tom 的示例,我修改了消息处理函数,使其不使用 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 上查看我的仪表板时,没有任何活动的记录。

成功了!

我终于让它工作了。我相信“最终”问题是我忽略了为我正在创建的电子邮件添加发件人地址。一旦我这样做了,它就像一个魅力。

【问题讨论】:

  • SendGridMail.dll 程序集似乎确实存在版本不匹配。参数绑定时出现错误“无法将 SendGridAttribute 绑定到类型 'SendGrid.Helpers.Mail.Mail”。

标签: azure sendgrid azure-webjobs


【解决方案1】:

请尝试使用 mydemo 代码。我使用WebJobs.Extensions.SendGrid 库,我已经测试过了。发布到 WebApp 后,它在 WebJob 中成功运行。 以下是我的测试代码和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("a@testmail.com");//a test email address
        string subject = "Hello World from the SendGrid CSharp Library!";
        Email to = new Email("b@testmail.com");// 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());
    }
  }
}

packages.config 文件如下:

<?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>

【讨论】:

  • 谢谢,汤姆,但这仍然给了我同样的错误。该问题似乎与我在应用程序启动代码中指定 UseSendGrid() 有关。我在我的问题中添加了更多细节。
  • 汤姆,我将您的回复标记为答案,谢谢。我不得不稍微修改一下方法。但关键步骤——使用最新的 SendGrid 程序集并在方法的主体中构建电子邮件消息,而不是使用 Azure 扩展示例使用的 out 参数方法——才是关键。对于任何对细节感兴趣的人,问题在于 Azure 扩展的最新稳定版本使用了旧版本的 SendGrid 程序集。从那时起,SendGrid API 更改了 >>log
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多