将文件附加到系统.Net.Mail 时出错.如何修复此错误



尝试发送带有附件的电子邮件。 但是我收到一个错误:

"无法从 转换 "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>中获取值,您必须使方法asyncawait任务。

你需要await when 调用返回 Task 的方法,所以代替这个

Attachments.Add(GetAttachment(attachmentFileName));

用:

Attachments.Add(await GetAttachment(attachmentFileName));

Attachments.Add(GetAttachment(attachmentFileName).GetAwaiter().GetResult());

最新更新