Azure WebJob抛出HttpRequestException

时间:2019-03-24 06:50:07

标签: c# azure azure-cosmosdb azure-webjobs azure-webjobs-continuous

我将Azure上的应用程序作为连续的WebJob托管。该程序经常(大约每秒一次)通过创建DocumentClient实例来调用CosmosDB数据库(我在结果IEnumber上使用DocumentClient函数CreateDocumentQuery和Linq Query来从数据库中检索对象)。当我在本地运行程序时,它的行为符合预期,没有任何问题。当我将程序发布为Azure WebJob并运行它时,我的日志表明正在抛出HttpRequestException,并显示以下消息:“发送请求时发生错误。”另外,我得到以下堆栈跟踪:

  

at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)      在System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)      在System.Threading.Tasks.Task1.get_Result()      在Microsoft.Azure.Documents.Linq.DocumentQuery1.d__31.MoveNext()      在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable`1源)处   在... 我的呼叫代码...

仅当我频繁使用DocumentClient且仅在WebJob一侧时,才出现此问题。在本地运行等效负载不会使我的应用程序崩溃。为什么在我的WebJob中发生此异常?可能值得注意的是,S1和P1V2 App Service层均会出现此问题。

1 个答案:

答案 0 :(得分:0)

DocumentClient不应基于每个请求使用,而是应在应用程序中将其用作单例实例。按请求创建客户端会增加很多延迟开销。

因此,我将Client属性声明为“静态”,然后在Service的构造函数中对其进行初始化。您可以在Connect方法中调用await Client.OpenAsync()来“预热”客户端,并且在每个公共方法中,都可以直接使用Client实例来调用DocumentDB API。

使用服务的Dispose方法处置客户端。

这些客户端被设计为可重复使用,因此建议您有一个静态实例,以在所有功能中重复使用。 在这里,您可以找到有关性能问题的提示:

https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#sdk-usage

希望有帮助!