尝试发送带有附件的电子邮件。 但是我收到一个错误:
"无法从 转换 "System.Threading.Tasks.Task" 到 'System.Net.Mail.Attachment'
我的错误发生在行Attachments.Add(GetAttachment(attachmentFileName));
我已经尝试了各种转换(请参阅代码(,但我不太明白问题是什么。 我知道解决方案就在我面前,但我看不到它。
public class NonFERosterEmail : BaseNotificationEmail<OfferViewModel>
{
public NonFERosterEmail(OfferViewModel vm, string emailList, string attachmentFileName) : base(vm)
{
To.AddRange(GetTo(emailList));
Body = GetBody();
Subject = GetSubject();
//Attachments.Add(new Attachment(GetAttachment(attachmentFileName)));
Attachments.Add(GetAttachment(attachmentFileName));
From = new MailAddress(ConfigurationManager.AppSettings["RedirectEmailTo"]);
}
//public async Task<List<Attachment>> GetAttachment(string attachmentFileName)
public async Task<Attachment> GetAttachment(string attachmentFileName)
{
//var ret = new List<Attachment>();
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["azureStorageAccount"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("attachments");
CloudBlockBlob blob = container.GetBlockBlobReference(attachmentFileName);
var contentType = MimeMapping.GetMimeMapping(attachmentFileName);
Stream target = new MemoryStream();
await blob.DownloadToStreamAsync(target);
target.Position = 0;
//ret.Add(new Attachment(target, attachmentFileName, contentType));
Attachment ret = new Attachment(target, attachmentFileName, contentType);
return ret;
}
//remainder of code left out for brevity
}
我希望GetAttachment
返回一个正确的附件对象,该对象将被添加到邮件对象并成功发送。
@SLaks 和 @Roman Marusyk 的答案是正确的,但看起来您正在从构造函数调用GetAttachment
,这不是异步的。因此,如果不使用async
方法,您将无法使用await
。尝试使用 result 属性 GetAttachment
如下所示。
Attachments.Add(GetAttachment(attachmentFileName).Result);
更好的解决方案是使用 .GetAwaiter().GetResult()
,正如 Marusyk @Roman指出并在这篇文章中展示的那样,如果该方法失败,它将直接抛出异常而不是抛出AggregateException
。
更好的解决方案是使用以下
Attachments.Add(GetAttachment(attachmentFileName).GetAwaiter().GetResult());
要从Task<T>
中获取值,您必须使方法async
并await
任务。
你需要await
when 调用返回 Task
的方法,所以代替这个
Attachments.Add(GetAttachment(attachmentFileName));
用:
Attachments.Add(await GetAttachment(attachmentFileName));
或
Attachments.Add(GetAttachment(attachmentFileName).GetAwaiter().GetResult());