Azure Webjob TextWriter 记录器被放置在我的方法中间

Posted

技术标签:

【中文标题】Azure Webjob TextWriter 记录器被放置在我的方法中间【英文标题】:Azure Webjob TextWriter logger being disposed in the middle of my method 【发布时间】:2015-10-09 00:54:26 【问题描述】:

我正在使用带有 Windows Azure 存储 SDK 的 Webjob。当队列中出现一个新项目时,我的类中的一个方法被调用。根据SDK docs,如果我将 TextWriter 作为我的方法的参数,SDK 将为我提供一个我可以写入的 TextWriter,它将显示在 Webjob 的日志记录基础结构中。这使得诊断问题和排除故障变得非常容易。

public async static void ProcessQueueMessage([QueueTrigger("queueName")]MyModelType model, TextWriter logger)


    await logger.WriteLineAsync(string.Format("Processing Item 0", model.SasUrl));

    // Some work here

    await logger.WriteLineAsync(string.Format("Done Processing Item 0", model.SasUrl));

然而,在我的方法体中,TextWriter 经常被丢弃。我在第二个 logger.WriteLineAsync 上遇到以下异常:

System.ObjectDisposedException was unhandled by user code
  HResult=-2146232798
  Message=Cannot write to a closed TextWriter.
  Source=mscorlib
  ObjectName=""
  StackTrace:
       at System.IO.__Error.WriterClosed()
       at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
       at System.IO.TextWriter.WriteLine(String value)
       at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
       at System.IO.TextWriter.SyncTextWriter.WriteLineAsync(String value)
       at NameOfProject.Program.<ProcessQueueMessage>d__8.MoveNext() in c:\Dev\Path\To\Program.cs:line 173
  InnerException:

我找不到其他人有这个问题,所以我无法想象 SDK 或 webjobs 基础设施中存在错误。

有没有办法在调用前判断记录器是否已被处理掉?

有没有办法在我的方法中创建一个将参与 WebJobs 日志记录子系统和 UI 的新记录器?

【问题讨论】:

对我来说没什么明显的,但我猜这是某种异步问题。异步静态无效控制台应用程序可能存在各种极端情况错误。您可以尝试放弃 async 并查看它是否仍然可以重现吗? 在 WebJob 处理程序中使用 async await 有什么特别的原因吗?据我了解,您的 Web 作业将在 SDK 主线程以外的不同线程中调用。这样主线程就不会被打扰了。 【参考方案1】:

那是因为你的方法返回void。尝试返回Task

【讨论】:

犯了同样的错误。我想自从我返回 void 调用线程并没有等待方法完成并直接处置文本编写器。应标记为解决方案。 谢谢!花了两个小时试图弄清楚为什么我的 TextWriter 被丢弃了。 知道为什么我会看到同样的错误,即使我没有使用异步? 它对我不起作用。我把函数改成了“public static async Task ...”,但还是有同样的问题。 @Wizmann 确保在处理代码中“等待”任何异步方法调用。

以上是关于Azure Webjob TextWriter 记录器被放置在我的方法中间的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 队列和 Azure WebJob

禁用触发的 Azure WebJob

Azure - 将 WCF 服务作为 WebJob 运行

将 WebJob 部署到 Azure 时出错?

在 azure 中创建 webjob 时出现 python 包安装错误

使用 WebJob 将 Web 应用程序发布到 Azure 时卡住