STMP客户端作为Azure函数应用程序中的Singleton



我有一个Azure Functions应用程序,它使用Amazon SES服务发送电子邮件,为了处理发送消息操作,我创建了一个客户端,并在我的Azure应用程序的Startup.cs中将其声明为单例。

看起来第一条消息发送正常,但随后的消息失败,并出现以下错误:

无法访问已释放的对象。对象名称:"System.Net.Mail.SmtpClient">

以下是我的客户端处理发送消息的样子:

using System;
using System.Net;
using System.Net.Mail;
public class SesClient
{
SmtpClient _client;
private string _senderEmail;
public SesClient(string smtpServer, int smtpPort, string amazonSesUserId, string amazonSesPassword, string senderEmail)
{
if (_client == null)
{
_client = new SmtpClient(smtpServer, smtpPort);
_client.Credentials = new NetworkCredential(amazonSesUserId, amazonSesPassword);
_client.EnableSsl = true;
_senderEmail = senderEmail;
}
}
public void SendEmailMessage(MailMessage message)
{
message.From = new MailAddress(_senderEmail, "John Doe");
using (_client)
{
try
{
_client.Send(message);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}

我在Startup.csConfigureServices()方法中创建了这个类作为单例,如下所示:

var smtpServer = Configuration["AmazonSes:SMTP_SERVER"];
var smtpPort = Convert.ToInt32(Configuration["AmazonSes:SMTP_PORT"]);
var sesUserId = Configuration["AmazonSes:USER_ID"];
var sesPassword = Configuration["AmazonSes:USER_PASSWORD"];
var senderEmail = Configuration["MyApp:EMAIL_ADDRESS"];
services.AddSingleton(new SesClient(smtpServer, smtpPort, sesUserId, sesPassword, senderEmail));

我认为将这个客户端创建为单例是正确的想法。这就是问题所在吗?如果没有,你知道这里可能有什么问题吗?

在您发布的代码中,using(_client)在发送第一封电子邮件后有效地处理了SmtpClient,因此;对象被丢弃";例外由于它是一个单例,因此不会再次调用构造函数。

最新更新