Клиент Service Fabric в функциях Azure - невозможно загрузить библиотеку DLL "FabricClient.dll" или одну из ее зависимостей

У меня есть приложение, работающее в функциях Azure, в том числе класс, который управляет приложениями и службами, работающими в кластере Service Fabric с использованием API-интерфейса клиента Service Fabric для.NET.

Приложение работает, когда я запускаю его локально в режиме отладки из Visual Studio, и подключение к Service Fabric Cluster работает как положено. При развертывании приложения в функциях Azure с помощью API-интерфейса клиента Service Fabric возникает исключение:

Результат выполнения: не удается загрузить DLL "Fabric Client.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

У меня установлен пакет Microsoft.ServiceFabric для проекта Visual Studio. Отсюда я установил win-x64-версию инструментов CLI функций Azure, а встроенная цель установлена ​​на x64; этим руководствуются тут и тут). Проект публикуется в функциях Azure с использованием zip-развертывания. Я проверил из пакета zip-развертывания, что он содержит библиотеку "System.Fabric.dll", и проверил, что это x64 с использованием CorFlags.exe, как описано здесь.

Еще один вопрос, связанный с переполнением стека, касающийся той же самой проблемы. В ходе обсуждения другой бедняга "tank140" в итоге столкнулся с тем же исключением. Обсуждение не пришло ни к какому разрешению, насколько я понимаю.

Обнаружил недостающую DLL на моем ПК для разработки, где работает локально. Fabric Client.dll находится в папке C:\Program Files\Microsoft Service Fabric\bin\Fabric\Fabric.Code. Вероятно, по той причине, что у меня на ПК установлен Service Fabric SDK. Как включить эту DLL в проект Function Apps для развертывания в Azure Functions?

Я посмотрел определение класса Fabric Client, на которое ссылается мой код (см. Рисунок ниже), в соответствии с VisualStudio этот класс определен в сборке "System.Fabric.dll". Это включено в проект с пакетом NuGet "Microsoft.ServiceFabric", как видно на рисунке. Как было сказано ранее, эта сборка также включена в пакет zip для развертывания. Сдается мне, что есть некоторое несоответствие с проектом VS и реальностью; Класс Fabric Client доступен в локальном развертывании из сборки, которая не объявлена ​​в зависимостях.

2 ответа

Решение

Вам нужно, чтобы среда SF была установлена ​​на платформе.

Я не уверен, что это работает, но, возможно, вы можете сделать это, используя контейнер с предустановленной средой выполнения.

Там изображение называется microsoft/service-fabric-reliableservices-windowsservercore Вы могли бы использовать. А вот как создать функцию Azure, которая запускает контейнер (Linux) с пользовательским образом.

Вероятно, будет намного проще, если вы просто создадите службу, которая управляет другими приложениями и службами, и запустите ее в кластере.

MS ответ на мой запрос поддержки:

.Net API Service Fabric недоступен для функций Azure, поскольку для его установки на платформе требуется установить SDK и среду выполнения Service Fabric, что невозможно сделать с помощью функции Azure.

Таким образом, в вашем случае доступны следующие варианты: перестроить приложение для использования API-интерфейса REST Service Fabric, и его можно будет запускать в функциях Azure.

Другой вариант, помимо запуска на виртуальной машине, заключается в создании пользовательского контейнера Windows, в который вы устанавливаете Service Fabric SDK и среду выполнения, а затем развертываете его, например, в контейнере Azure.

Другие вопросы по тегам