【问题标题】:Service Fabric Client on Azure Functions - Unable to load DLL 'FabricClient.dll' or one of its dependenciesAzure Functions 上的 Service Fabric 客户端 - 无法加载 DLL“FabricClient.dll”或其依赖项之一
【发布时间】:2019-07-19 06:49:42
【问题描述】:

我有一个在 Azure Functions 上运行的应用程序,包括一个使用适用于 .NET 的 Service Fabric 客户端 API 管理在 Service Fabric 群集上运行的应用程序和服务的类。

当我从 Visual Studio 以调试模式在本地运行应用程序时,应用程序工作正常,并且与 Service Fabric 群集的连接按预期工作。当我将应用程序部署到 Azure Functions 时,使用 Service Fabric 客户端 API 会导致异常:

执行结果:无法加载 DLL 'FabricClient.dll' 或其之一 依赖项:找不到指定的模块。 (例外来自 HRESULT: 0x8007007E)

下面的简化代码。

// SfClientApiHelper.cs

    using System.Fabric;
    using System.Fabric.Description;

    namespace MyService
    {
        class SfClientApiHelper
        {
            private FabricClient Client { get; set; }
            . . .
            public SfClientApiHelper()
            {
                . . .
                this.Client = new FabricClient();
            }

// ClassUsingSfClientApiHelper.cs
         . . .
    SfClientApiHelper sfHelper = new SfClientApiHelper();  // => exception

我在 Visual Studio 项目中安装了 Microsoft.ServiceFabric 包。我从here 安装了win-x64 版本的Azure Functions CLI 工具,构建目标设置为x64;这些指导 herehere)。项目使用 zip 部署发布到 Azure Functions,我从 zip 部署包中检查它是否包含库“System.Fabric.dll”,并按照 here 的指导使用 CorFlags.exe 检查它是否为 x64。

另一个 stackoverflow question 关于同样的问题,在讨论中其他可怜的家伙 'tank140' 最终遇到了同样的异常。根据我的理解,讨论没有达成任何解决方案。

在本地运行的开发 PC 上发现缺少的 DLL。 FabricClient.dll 位于文件夹 C:\Program Files\Microsoft Service Fabric\bin\Fabric\Fabric.Code。可能是因为我在 PC 上安装了 Service Fabric SDK。 如何将这个 DLL 包含在 Function Apps 项目中以部署到 Azure Functions?

我查看了代码中提到的 FabricClient 类的定义(见下图),根据 VisualStudio,该类是在程序集“System.Fabric.dll”中定义的。这包含在带有 NuGet 包“Microsoft.ServiceFabric”的项目中,如图所示。如前所述,此程序集也包含在部署 zip 包中。在我看来,VS项目和现实有些不匹配; FabricClient 类可在本地部署中从未在依赖项中声明的程序集访问。

【问题讨论】:

    标签: azure-functions azure-service-fabric


    【解决方案1】:

    您需要在平台上安装 SF 运行时。

    我不确定这是否可行,但也许您可以通过使用预安装运行时的容器来做到这一点。

    您可以使用名为microsoft/service-fabric-reliableservices-windowsservercore 的图像。 并 here's how 创建一个 Azure 函数,该函数使用自定义映像运行 (Linux) 容器。

    如果您只是创建一个管理其他应用程序和服务的服务并在集群上运行它,这可能会简单得多

    【讨论】:

    • 目前我们有中间主机 (Azure VM),它正在处理来自 Azure Functions App 的请求以操作 SF 集群。目标是摆脱这个中间主机,看看我们是否可以为此使用 SF Client API。原则上,建议的解决方案类似于我们当前的配置。
    • 如果通过 Azure Service Fabric libraries for .NET 使用 SF Client API 需要安装 SF 运行时的主机,当前的方法是死路一条。您认为在没有主机的情况下使用 Azure Functions 中的 Service Fabric Client REST API 可行吗?
    • 感谢您的帮助。 MS 对我提出的 Azure 支持票给出了相同的答案。
    【解决方案2】:

    MS 对我的支持请求的答复:

    Service Fabric .Net API 不适用于 Azure 函数,因为 需要将 Service Fabric SDK 和运行时安装在 无法使用 Azure 函数完成的平台。

    所以在你的情况下 可用的选项是重建应用程序以 使用 Service Fabric REST API,这应该能够在 Azure 函数。

    除了在虚拟机上运行之外,另一个选择是 创建一个自定义 Windows 容器,您可以在其中安装服务 Fabric SDK 和运行时,他们将其部署在 Azure 中 容器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2019-12-02
      • 2011-05-23
      相关资源
      最近更新 更多