WebJob 未加载 SendGridMail 程序集
WebJob Not Loading SendGridMail Assembly
我正在尝试使用 Azure WebJobs 的 SendGrid 扩展。我尝试按照示例进行操作,但不幸的是,WebJob 应用程序崩溃并出现以下错误:
Could not load file or assembly 'SendGridMail, Version=6.1.0.0,
Culture=neutral, PublicKeyToken=2ae73662c35d80e4' or one of its
dependencies. The system cannot find the file specified.
在涉及 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.Helpers.Mail 命名空间在 SendGrid v6.1 中不存在。
其他详细信息
根据 Tom 的反馈,我卸载了 SendGrid 扩展 nuget 包,并通过编辑 project.json 安装了所需的库 "manually"。这让我获得了每个库的最新稳定版本...但是应用程序在启动时仍然崩溃并出现相同的错误。
这是启动代码:
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() );
控制台应用程序现在可以正常启动,消息处理器 运行 也很好...但是没有发送电子邮件。或者,更确切地说,none 到了,当我在 SendGrid.com 检查我的仪表板时,没有任何 activity.
的记录
成功!
我终于让它工作了。我认为 "final" 问题是我忽略了为我正在创建的电子邮件添加发件人地址。一旦我这样做了,它就像一个魅力。
请尝试使用我的演示代码。我使用 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>
我正在尝试使用 Azure WebJobs 的 SendGrid 扩展。我尝试按照示例进行操作,但不幸的是,WebJob 应用程序崩溃并出现以下错误:
Could not load file or assembly 'SendGridMail, Version=6.1.0.0, Culture=neutral, PublicKeyToken=2ae73662c35d80e4' or one of its dependencies. The system cannot find the file specified.
在涉及 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.Helpers.Mail 命名空间在 SendGrid v6.1 中不存在。
其他详细信息
根据 Tom 的反馈,我卸载了 SendGrid 扩展 nuget 包,并通过编辑 project.json 安装了所需的库 "manually"。这让我获得了每个库的最新稳定版本...但是应用程序在启动时仍然崩溃并出现相同的错误。
这是启动代码:
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() );
控制台应用程序现在可以正常启动,消息处理器 运行 也很好...但是没有发送电子邮件。或者,更确切地说,none 到了,当我在 SendGrid.com 检查我的仪表板时,没有任何 activity.
的记录成功!
我终于让它工作了。我认为 "final" 问题是我忽略了为我正在创建的电子邮件添加发件人地址。一旦我这样做了,它就像一个魅力。
请尝试使用我的演示代码。我使用 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>