. Net Внедрение основных зависимостей. Это новый экземпляр SmtpClient для каждого запроса? - PullRequest
0 голосов
/ 09 января 2020

Мы внедряем пользовательскую почтовую программу, которая принимает SmtpClient в качестве параметра, в зависимости от того, отлаживаем мы или нет, мы используем несколько иную реализацию SmtpClient:

public static void AddSmtpMailer(this IServiceCollection services, IHostingEnvironment environment)
{
    services.AddTransient<IMailer<BaseModel>>(x => new Mailer<BaseModel>(
        environment.IsDevelopment()
            ? new SmtpClient
            {
                PickupDirectoryLocation = @"c:\temp",
                DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory
            }
        : new SmtpClient
        {
            Host = "mail.someplace.com",
            Port = 25,
            EnableSsl = true,
            Credentials = new NetworkCredential("user", "password")
        },
        environment.ContentRootPath, environment.IsLive()));
}

Однако мы находим что, когда мы пытаемся отправить несколько электронных писем в быстрой последовательности, мы получаем эту ошибку: error message

Поэтому мой вопрос таков: получаем ли мы каждый раз новый экземпляр SmtpClient? Потому что это похоже на проблему, связанную с отправкой нескольких писем с одинаковым SmtpClient. Создаем ли мы один экземпляр SmtpClient при запуске и повторно используем его каждый раз?

Обратите внимание, мы также попробовали .AddScoped, но обнаружили то же поведение.

фактический код, который использует SmtpClient:

 public sealed class Mailer<T> :IDisposable, IMailer<T> where T : BaseModel
{
    private readonly SmtpClient _smtpClient;
    private readonly string _contentRootPath;
    private readonly bool _forceSandbox;

    public Mailer(SmtpClient smtpClient, string contentRootPath, bool isLive)
    {
        _smtpClient = smtpClient;
        _contentRootPath = contentRootPath;
        _forceSandbox = !isLive;
    }

    public async Task<bool> SendEmail(T model, string template)
    {
        if (template.Contains(".cshtml"))
            template = template.Replace(".cshtml", "");

        Email.DefaultSender = new SmtpSender(_smtpClient);
        Email.DefaultRenderer = new RazorRenderer();

        var email = Email
            .From(model.From.Email, model.From.Name.NullOrEmptyTo(model.From.Email))
            .To(EmailAddressHelper.GetAddressesFromModel(model.Recipients, _forceSandbox))
            .Subject(model.Subject)
            .UsingTemplateFromFile($@"{_contentRootPath}\views\{template}.cshtml", model)
            .Attach(EmailAttachmentHelper.GetAttachmentsFromModel(model.Attachments));

        if (model.CcRecipients != null && model.CcRecipients.Any())
            email.CC(EmailAddressHelper.GetAddressesFromModel(model.CcRecipients, _forceSandbox));

        if (model.BccRecipients != null && model.BccRecipients.Any())
            email.BCC(EmailAddressHelper.GetAddressesFromModel(model.BccRecipients, _forceSandbox));

        email.Data.Headers = EmailHeaderHelper.GetHeaders(model.UniqueID, model.Headers);

        var result = await email.SendAsync();
        return result.Successful;
    }

    public void Dispose()
    {
        _smtpClient?.Dispose();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...