【问题标题】:Azure Function throws exception for Azure Document Client constructor (works in test harness)Azure 函数为 Azure 文档客户端构造函数引发异常(在测试工具中工作)
【发布时间】:2018-01-25 22:43:27
【问题描述】:

我有一个最终执行这行代码的 Azure 函数:

cosmosClient = new DocumentClient(endpoint, key, mode, null);

这在我们使用的大型 Web 应用程序以及测试工具中都能完美运行。当我在 Azure 函数中调用调用它的代码时,会产生以下异常:

Exception while executing function: Functions.ColdStorageReset. mscorlib: Exception has been thrown by the target of an invocation. zzz.DataLayer: Method not found: 'Void Microsoft.Azure.Documents.Client.DocumentClient..ctor(System.Uri, System.String, Microsoft.Azure.Documents.Client.ConnectionPolicy, System.Nullable`1<Microsoft.Azure.Documents.ConsistencyLevel>, Newtonsoft.Json.JsonSerializerSettings)'.
2018-01-25T22:33:15.436

Microsoft.Azure.Documents.Client.dll 的版本在所有位置都是 1.15.1.1。我也试过这个:

cosmosClient = new DocumentClient(endpoint, key, mode);

这给了我同样的结果。

有什么想法吗?

【问题讨论】:

  • 这是一个编译函数吗?您的 cosmosClient 变量是如何定义的以及在哪里定义的?
  • 这是一个 csx。它在类级别定义为:private DocumentClient cosmosClient;
  • 首先,我假设这是 v1 主机运行时上的预编译函数?您的项目引用了哪个版本的 NewtonSoft.Json?
  • NewtonSoft 版本为 10.0.0.0。
  • 是的,所以...你不能那样做。 :( 我将在下面提供更清晰的答案。

标签: c# azure azure-cosmosdb azure-functions


【解决方案1】:

嘘……这真是一场噩梦。

我最终通过更新每个可见的依赖项来克服最初的冲突。在那之后,它就消失了,我根本不了解问题所在。然后,在另一轮更新之后,它再次出现,这次是 Microsoft.IdentityModel.Clients.ActiveDirectory 库,抱怨它无法加载我没有引用的版本(在最后的统计中,我真的没有引用它)。

在试图找出引用的来源后,我感到绝望,并开始反编译依赖的 dll 以查看引用。令人难以置信的是,这奏效了,我找到了一个引用旧版本 M.I.C.ActiveDirectory 的依赖 dll。这里发生的总体问题是:

我的库引用了一个依赖库,而该依赖库又引用了问题库的错误版本。由于 app.config 中的绑定重定向,这在本地编译时并不明显。

Azure Functions 不(本机)支持绑定重定向,因此必须手动实现重定向。我在这里找到了这种方法的实现:https://codopia.wordpress.com/2017/07/21/how-to-fix-the-assembly-binding-redirect-problem-in-azure-functions/

尽管文章指出,每次函数执行时调用重定向函数似乎都可以。简而言之,您正在添加一个带有绑定重定向信息的函数应用设置,在代码中反序列化它,然后调用一些应用程序域 jiggery-pokery 来实际执行重定向。效果很好。

如文章所述,唯一的缺点是每次更新库时都必须更新应用设置,但我现在可以忍受。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多