【问题标题】:Why is my webjob terminating without throwing an exception?为什么我的网络作业终止而没有引发异常?
【发布时间】:2014-12-15 02:39:18
【问题描述】:

我的 azure webjob 似乎在没有抛出异常的情况下终止,我迷路了。

我的网络作业是按需(或计划)运行的,并且依赖于我的网站 DLL(和 MVC 应用程序)。它调用它来完成大部分工作,其中包括使用实体框架数据库和对其他几个站点进行 REST 调用。大多数工作都是异步完成的。用于完成这项工作的大部分代码也可以毫无问题地从网站的其他部分调用,而且毫无疑问,Web 作业在本地运行时可以完美运行。

Web 作业终止并且似乎没有抛出异常,而且似乎无法调试不属于连续运行类型的 Web (?)。因此,我的调试主要是 Console.WriteLine 种类。由于这个原因和异步性,我无法确定它崩溃的确切位置 - 我认为它是在访问数据库时,但在处理它之后,数据库访问开始工作......呃。我的下一个最佳猜测是它在等待或其他异步管道期间死亡。但是,它确实会在两个 try/catch 块内崩溃,这些块具有将结果记录到 redis 和 azure 存储的 finally。这些都不会发生。我无法弄清楚或想象这个进程是如何在没有遇到任何异常处理程序的情况下崩溃的......?

有人在使用 azure webjob 时遇到过这个问题吗?知道我应该寻找什么或调试此问题的任何提示吗?

谢谢!

【问题讨论】:

  • 你在使用async void吗?
  • 你能分享一些代码吗?
  • 我从网络作业过程中调用的方法的签名是:public async Task GenerateFeed(bool dryRun = false)

标签: azure azure-webjobssdk


【解决方案1】:

我想通了!异步发生的许多事情之一是创建证书。我追查到这个:

signedCert = new X509Certificate2(cert, "notasecret", X509KeyStorageFlags.Exportable);

当从我的 azure 网站或我的测试调用时,此代码可以正常工作,但会完全终止 webjob 进程而不会引发异常!例如,下面异常处理程序中的 WriteLine 永远不会被调用:

X509Certificate2 signedCert;
try
{
    signedCert = new X509Certificate2(cert, "notasecret", X509KeyStorageFlags.Exportable);
}
catch (Exception ex)
{
    // We never get here! Argh!
    Console.WriteLine("Exception converting cert: " + ex);                
    throw;
}

非常耗时且令人沮丧。与诊断不同,修复很简单:

signedCert = new X509Certificate2(
    cert, 
    "notasecret", 
    X509KeyStorageFlags.Exportable | 
    X509KeyStorageFlags.MachineKeySet |
    X509KeyStorageFlags.PersistKeySet);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多