c# - 在 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)
{
}
}
有人可以解释一下为什么第一种方法不起作用而第二种方法起作用。
解决方案
推荐阅读
- javascript - 如何在考虑服务器负载的同时制作多人 javascript 游戏作弊证明
- r - 如何使用“”、“”之类的分隔符
- php - 如何使用php从文件中读回加密的字符串
- mysql - MariaDB 中是否有等效于 sprintf('%+03d:00', $my_number) 的功能?
- c - 区分 uid 范围的 kill(-1,…) 和有针对性的 kill
- java - RAD - 如何在 websphere 应用程序服务器管理控制台中为 JAX-WS 添加用户名令牌
- php - WordPress:对自定义帖子类型的评论
- regex - 正则表达式匹配多行中最后一次出现的字符串
- selenium-webdriver - Selenium WebDriver - 无法连接到 Mozilla geckodriver
- r - 将多个不完整的列“汇总”为 1 个汇总列