自定义OwinMiddleware中的异步方法失败

时间:2016-07-18 15:34:06

标签: c# .net async-await owin

当我想在服务器上发生某种异常时发送电子邮件时,我在自定义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检测到不完整的异步工作并引发上述异常。

由于我不确定自己是对还是错,有人可能会确认(或解释原因)工作方法在这种情况下完全可以使用吗?

谢谢!

0 个答案:

没有答案