【问题标题】:HostingEnviroment.QueueBackgroundWorkItem works on localhost but cancels on IISHostingEnviroment.QueueBackgroundWorkItem 在本地主机上工作,但在 IIS 上取消
【发布时间】:2017-10-11 13:13:18
【问题描述】:

我希望服务器通过邮件更新用户,因为邮件发送大约需要 5 秒,我想在后台线程上运行它。问题是 IIS 在完成之前取消了我的后台操作。

以下代码在我在 Visual Studio 中测试时有效,但在我在 Windows 服务器上测试时无效:

HostingEnvironment.QueueBackgroundWorkItem(ct => ProgressMail(ct, smtpSend, emailMessage));

而我的progressmail方法如下:

private static void ProgressMail(CancellationToken ct, SmtpClient client, MailMessage message)
{
    try
    {
        ct.ThrowIfCancellationRequested();
        client.Send(message);
    }
    catch (Exception ex)
    {
        Log.Logger.Error("Error sending mail in background thread", ex);
    }
}

msdn 上的 Microsoft 文档声明如下:

与普通的 ThreadPool 工作项不同,ASP.NET 可以跟踪通过此 API 注册的工作项当前正在运行的数量,并且 ASP.NET 运行时将尝试延迟 AppDomain 关闭,直到这些工作项完成执行.无法在 ASP.NET 管理的 AppDomain 之外调用此 API。提供的 CancellationToken 将在应用程序关闭时发出信号。

ASP.NET 运行时将尝试延迟关闭。但它仍然关闭。我在这里做错了什么?即使请求完成,如何强制我的应用程序继续运行。

【问题讨论】:

  • 我从来没有经历过这样的事情。 “取消您的后台操作”意味着异常处理程序被相应的OperationCanceledException?
  • 异常ex为null
  • 是什么让你认为操作被取消了?您是如何确认这一点的?
  • 我认为它是 dit,因为 client.send(message) 在本地计算机和 Windows 服务器上都可以工作,但是当将代码放入 QueueBackgroundWorkItem() 时,记录器会被命中,但仅在 Windows 服务器上。
  • 不客气。只是一个想法:也许你过早地处理了SmtpClient

标签: c# asp.net-mvc asynchronous queue


【解决方案1】:

感谢@Peit,我知道要更仔细地查看 SMTPClient 而不是 HostingEnviroment.QueueBackgroundItem()

问题在于在 IIS 上使用 SMTP 发送电子邮件。不得不补充:

client.DeliveryMethod = SmtpDeliveryMethod.Network;

现在它可以在 localhost 和 IIS 上运行 :)

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2020-11-03
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多