我遇到了一个以前从未遇到过的问题,在搜索时似乎找不到任何类似的问题。
我的问题是这个。
我有一个电子邮件方法,它使用内存流附加PDF,然后使用SendAsync方法发送电子邮件。不过,很少会将附件附加到不同用户的电子邮件中。
这种情况只发生在极为罕见的情况下,而且似乎是由两封电子邮件同时发送引起的,即使在那时,这种情况也很少发生。
问题是,无论多么罕见,它都不应该发生,所以我想修复它
PDF是通过将返回PDF的URL的结果下载到WebClient对象中,然后使用将WebClient.DownloadData方法的结果读取到内存流中来生成的。然后将内存流附加到MailMessage对象,并使用SMTPClient对象的SendAsync方法发送。
正如我所说,这个问题很少发生,不幸的是,这使得测试变得非常困难。
这是我的代码的一个例子(没有实际值,只是一个如何创建的例子,以一种精简的方式,即没有错误捕获等):
var mailMessage = new MailMessage("fromaddress@test.com", "toaddress@test.com", "Subject");
var smtpClient = new SmtpClient();
mailMessage.Body = "Test";
var stream = new MemoryStream(new WebClient().DownloadData("test.com"));
var attachment = new Attachment(stream, "filename.pdf", System.Net.Mime.MediaTypeNames.Application.Pdf);
mailMessage.Attachments.Add(attachment);
smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompleteCallback); // this is a method for logging errors etc
smtpClient.SendAsync(mailMessage, "randomGuidToken");
当问题确实发生时,只有同时收到两个附件的用户才能收到电子邮件。另一个用户什么也得不到,没有电子邮件或附件。
感谢所有的帮助。
我已经设法解决了我的问题。
这取决于SmtpClient和MailMessage类是如何被实例化和处理的(在本例中是不是)。
我发现最初的代码是将SmtpClient和MailMessage对象创建为类范围的变量,该变量在类构造函数中初始化,而唯一处理对象处理的代码是SendAsynCompleted回调方法。
我现在已经更改了代码,以便在类中需要SmtpClient和MailMessage对象的每个方法中实例化它们,并确保显式地处理这些对象。
我现在也不再使用SendAsync方法,只使用标准的Send方法(我可能会考虑回到异步方法,但我认为需要做更多的测试和重构)。