我有一个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("[email protected]");
using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
{
smtpClient.Credentials = new NetworkCredential("[email protected]", "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也会处理附件。但是,它没有帮助。有任何想法吗?实际上,如果我尝试从资源管理器中删除该文件,它也会告诉我该文件正在使用中。只有在我杀死正在运行的项目后(通过点击Visual Studio中的STOP按钮)我才能删除这些文件。
附:我还没有在实时服务器上测试过这个...目前我正在我的工作站上测试它,在Visual Studio 2017中以调试模式运行,如果这有所不同......
在使用过程中添加附件
//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("[email protected]");
using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
{
smtpClient.Credentials = new NetworkCredential("[email protected]", "12345");
smtpClient.EnableSsl = true;
await smtpClient.SendMailAsync(mailMessage);
}
}
File.Delete(@"C:\a.pdf");
File.Delete(@"C:\b.pdf");
return Ok();
}
阅读Daniel的评论后,我把附件了运行文件夹(其中API运行状态)的,现在它的罚款。它看起来像Visual Studio被锁定这些文件,即使他们不是我的项目的一部分,甚至没有出现在我的解决方案资源管理器。