这就是几天前我可以向客户发送电子邮件的方式。但是现在,它出现了这个错误。
此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =“true”%>。此异常还可能表示尝试调用“异步void”方法,该方法通常在ASP.NET请求处理中不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。
我通过向客户发送邮件来完成此操作。我也看过其他错误的人。
public static async void NewPassword(string mail, string name, string password)
{
MailDefinition oMailDefinition = new MailDefinition();
oMailDefinition.BodyFileName = "~/img/emailskabelon/NewPassword.html";
oMailDefinition.From = OrdklarMail;
Dictionary<string, string> oReplacements = new Dictionary<string, string>();
oReplacements.Add("<<navn>>", name);
oReplacements.Add("<<password>>", password);
MailMessage oMailMessage = oMailDefinition.CreateMailMessage(mail, oReplacements, new LiteralControl());
oMailMessage.Subject = Password;
oMailMessage.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient(AzureApi);
NetworkCredential netcred = new NetworkCredential(AzureName, AzurePassword);
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = true;
smtp.Credentials = netcred;
smtp.Port = Port25;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
using (var smtpClient = new SmtpClient())
{
await Task.Delay(1500);
await Task.Factory.StartNew(() => oMailMessage);
await smtpClient.SendMailAsync(oMailMessage);
}
//smtp.Send(oMailMessage);
}
有什么问题,因为它不会向客户发送电子邮件? - 这是我的问题。
答案 0 :(得分:1)
您的代码存在许多不同的问题,从async void
返回类型开始,不支持ASP.NET (您的异常告诉您)。
此外,您正在创建SmtpClient
的两个不同实例,并使用错误的实例发送电子邮件。
另外,为什么你甚至等待两个完全没用的任务?
这是一个固定版本:
public static async Task NewPassword(string mail, string name, string password)
{
MailDefinition oMailDefinition = new MailDefinition();
oMailDefinition.BodyFileName = "~/img/emailskabelon/NewPassword.html";
oMailDefinition.From = OrdklarMail;
Dictionary<string, string> oReplacements = new Dictionary<string, string>();
oReplacements.Add("<<navn>>", name);
oReplacements.Add("<<password>>", password);
MailMessage oMailMessage = oMailDefinition.CreateMailMessage(mail, oReplacements, new LiteralControl());
oMailMessage.Subject = Password;
oMailMessage.IsBodyHtml = true;
using(SmtpClient smtp = new SmtpClient(AzureApi))
{
NetworkCredential netcred = new NetworkCredential(AzureName, AzurePassword);
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = true;
smtp.Credentials = netcred;
smtp.Port = Port25;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
await smtp.SendMailAsync(oMailMessage);
}
}
另请注意,您需要将页面声明为:
<%@ Page Async="true" %>
使用页面中的await
调用此方法。
答案 1 :(得分:0)
另一个问题可能是你忘记使用等待代码的某个地方。我的意思是,如果您刚刚开始执行任务并继续执行页面。一旦提供页面请求,ASP.NET就可以将此线程标记为已完成,并且GarbageCollector可以在之后的任何时间将其销毁。这将导致您的任务将消失。这个时间不是一成不变的,所以有时你的后台任务可能会完成而有些时候不会。