当我想在服务器上发生某种异常时发送电子邮件时,我在自定义OwinMiddleware类中遇到了问题。
基本上,这是我的OwinMiddleware实现:
public class ErrorNotificationMiddleware : OwinMiddleware
{
{...}
public override async Task Invoke(IOwinContext context)
{
await this.Next.Invoke(context);
{...}
//WORKS
await Task.Run(() => errorNotificationService.SendMailAsync(errorMessageParams));
//DOESN'T WORK
//await errorNotificationService.SendMailAsync(errorMessageParams);
}
}
}
不起作用的方法会导致以下异常:
异常:(System.Net.Mail.SmtpException)发送邮件失败。
内部异常:(System.InvalidOperationException)此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =“true”%>。此异常还可能表示尝试调用“异步void”方法,该方法通常在ASP.NET请求处理中不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。
我想这是因为OwinMiddleware(异步处理程序?)将在服务器发送电子邮件之前完成请求。考虑到这一点,.Net检测到不完整的异步工作并引发上述异常。
由于我不确定自己是对还是错,有人可能会确认(或解释原因)工作方法在这种情况下完全可以使用吗?
谢谢!