首页 > 解决方案 > 在 SendMailAsync 方法中出现异常时,任务被取消异常

问题描述

我正在开发一个 MVC 应用程序。我的 API 是用 ASP.NET MVC Web API 编写的。我在按钮单击时调用 API。单击按钮时的 MVC 控制器代码是:

try
{
    using (var client = new HttpClient())
    {
        client.Timeout = new TimeSpan(0, 0, 30);
        var response = await client.PostAsync(url, data);
        string responseFromApi = response.Content.ReadAsStringAsync().Result;
        if (responseFromApi.Length > 1)
        {
            // My logic
        }
        else
        {
        }
    }
}
catch(Exception ex)
{
}

我从我的 API 发送电子邮件:

public async Task<HttpResponseMessage> AddOrder(CustomerOrder order)
{
    try
    {
        await sendEmail(orderNumber, order.EmailId);

        return Request.CreateResponse(HttpStatusCode.OK, 0);
    }
    catch(Exception ex)
    {   
    }
}

sendEmail 方法是:

private async Task sendEmail(string orderNumber, string clientEmailId)
    {
        //SmtpClient smtp = null;
        //int response = 0;
        try
        {
            string smtpAddress = "smtp.gmail.com";
            int portNumber = 587;
            bool enableSSL = true;
            string emailFromAddress = "email"; //Sender Email Address  
            string password = "password"; //Sender Password  
            string emailToAddress = clientEmailId; //Receiver Email Address  
            string subject = "Subject";
            string body = $"Body";

            using (MailMessage mail = new MailMessage())
            {
                mail.From = new MailAddress(emailFromAddress);
                mail.To.Add(emailToAddress);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                //mail.Attachments.Add(new Attachment("D:\\TestFile.txt"));//--Uncomment this to send any attachment  
                using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
                {   
                    smtp.Credentials = new NetworkCredential(emailFromAddress, password);
                    smtp.EnableSsl = enableSSL;
                    await smtp.SendMailAsync(mail);
                }
                
            }
        }
        catch(Exception ex)
        {

        }
    }

现在,如果sendEmail方法中有任何异常,例如(我在开发机器上关闭了 Internet),我将在 MVC 控制器端(客户端)收到“任务已取消”异常。如果sendEmail方法没有异常,那么一切正常。

这里可能的问题是什么?我只是卡住了,找不到任何解决方案。任何帮助将非常感激。

暂时为我解决问题的代码是:

private async Task sendEmail(string orderNumber, string clientEmailId)
{
    try
    {
        string smtpAddress = "smtp.gmail.com";
        int portNumber = 587;
        bool enableSSL = true;
        string emailFromAddress = "email"; //Sender Email Address  
        string password = "password"; //Sender Password  
        string emailToAddress = clientEmailId; //Receiver Email Address  
        string subject = "Subject";
        string body = $"Body";

        using (MailMessage mail = new MailMessage())
        {
            mail.From = new MailAddress(emailFromAddress);
            mail.To.Add(emailToAddress);
            mail.Subject = subject;
            mail.Body = body;
            mail.IsBodyHtml = true;
            //mail.Attachments.Add(new Attachment("D:\\TestFile.txt"));//--Uncomment this to send any attachment  
            using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
            {   
                smtp.Credentials = new NetworkCredential(emailFromAddress, password);
                smtp.EnableSsl = enableSSL;
                //await smtp.SendMailAsync(mail);
                await Task.Run(async () => await smtp.SendMailAsync(mail));
            }
                
        }
    }
    catch(Exception ex)
    {

    }
}

有人可以解释一下为什么第一种方法不起作用而第二种方法起作用。

标签: c#asp.net-mvcasp.net-web-apiasync-awaittask

解决方案


推荐阅读