Файлы, используемые после отправки нескольких вложений через SmtpClient/System.Net.Mail

У меня есть ASP .Net Core 2.2 Web API. В нем у меня есть контроллер, который используется интерфейсом для отправки электронной почты. Он использует System.Net.Mail. Я максимально упростил код:

    //POST: api/Email
    [HttpPost]
    public async Task<IActionResult> Post()
    {
        string attachment1 = Path.Combine(System.AppContext.BaseDirectory, "Attachments", "a.pdf");
        string attachment2 = Path.Combine(System.AppContext.BaseDirectory, "Attachments", "b.pdf");

        using (MailMessage mailMessage = new MailMessage())
        {
            mailMessage.Attachments.Add(new Attachment(attachment1));
            mailMessage.Attachments.Add(new Attachment(attachment2));                
            mailMessage.To.Add("someone@somehwere.com");

            using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
            {
                smtpClient.Credentials = new NetworkCredential("me@gmail.com", "12345");
                smtpClient.EnableSsl = true;
                await smtpClient.SendMailAsync(mailMessage);
            }
        }

        File.Delete(attachment1);
        File.Delete(attachment2);

        return Ok();
    }

Когда я пытаюсь удалить вложения, я получаю следующую ошибку:

Ошибка: процессу не удается получить доступ к файлу 'C:\Users\fabsr\source\repos\PropWorx.API\PropWorx.API\bin\Debug\netcoreapp2.2\Attachments\a.pdf', поскольку он используется другим процессом,

Я попытался добавить это прямо перед удалением строк:

foreach (var attachment in mailMessage.Attachments)
    attachment.Dispose();

Несмотря на то, что из того, что я прочитал, удаление MailMessage также удалит вложения. Однако это не помогло. Есть идеи? Действительно, если я попытаюсь удалить файл из Проводника, он также скажет мне, что файл используется. Только после того, как я уничтожу запущенный проект (нажав кнопку STOP в Visual Studio), я смогу удалить файлы.

Ps Я еще не тестировал это на живом сервере... в настоящее время я тестирую это на своей рабочей станции, работающей в режиме отладки в Visual Studio 2017, если это имеет значение...

2 ответа

Добавить вложения во время использования

  //POST: api/Email
    [HttpPost]
    public async Task<IActionResult> Post()
    {

        using (MailMessage mailMessage = new MailMessage())
        {
            mailMessage.Attachments.Add(new Attachment(@"C:\a.pdf"));
            mailMessage.Attachments.Add(new Attachment(@"C:\b.pdf"));
            mailMessage.To.Add("someone@somehwere.com");

            using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
            {
                smtpClient.Credentials = new NetworkCredential("me@gmail.com", "12345");
                smtpClient.EnableSsl = true;
                await smtpClient.SendMailAsync(mailMessage);
            }
        }

        File.Delete(@"C:\a.pdf");
        File.Delete(@"C:\b.pdf");

        return Ok();
    }

Прочитав комментарий Даниэля, я вынул вложения из рабочей папки (где работал API), и теперь все в порядке. Похоже, Visual Studio блокировала эти файлы, хотя они не были частью моего проекта и даже не появлялись в моем обозревателе решений.

Другие вопросы по тегам