Файлы, используемые после отправки нескольких вложений через SmtpClient / System.Net.Mail - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть 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 ]

0 голосов
/ 12 февраля 2019

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

0 голосов
/ 12 февраля 2019

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

  //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();
    }
...