«sni.dll» не найден при использовании System.Data.SqlClient с помощью Azure C#

Я пытаюсь выполнить запрос SELECT с моего сервера sql через приложение-функция Azure, чтобы позже работать с извлеченными из него данными. Я новичок в Azure, поэтому могу что-то упустить. Моя версия среды выполнения ~3. Это триггерная функция C# HTTP.

Мой код полностью основан на этой записи в блоге https://randypaulo.com/2018/12/19/querying-azure-sql-database-using-azure-functions-2-0-to-return-json-data/

Это та часть, где он ломается, в conn.Open();

      try 
        {
            var str = Environment.GetEnvironmentVariable("sqldb_connection");
            
            using(SqlConnection conn =new SqlConnection(str))
                {
                    using(SqlCommand cmd =new SqlCommand())
                        {
                            SqlDataReader dataReader;
                            cmd.CommandText = "SELECT TOP 10 ID FROM CATALOG";
                            cmd.CommandType = CommandType.Text;
                            cmd.Connection = conn;
                            conn.Open(); 
                            dataReader = cmd.ExecuteReader();
                            var r = Serialize(dataReader);
                            json = JsonConvert.SerializeObject(r, Formatting.Indented);
                        }

                    }
        }

Функция успешно компилируется с примерно 10+ предупреждениями, которые выглядят так.

      2021-02-01T21:54:58.159 [Warning] warning CS1701: Assuming assembly reference 'System.Data.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' used by 'System.Data.SqlClient' matches identity 'System.Data.Common, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' of 'System.Data.Common', you may need to supply runtime policy

Однако, когда дело доходит до фактического выполнения запроса, в conn.Open(); линия. Я получаю очень длинное сообщение об ошибке. Но он говорит: «Невозможно загрузить DLL« sni.dll »или одну из ее зависимостей:»

      2021-02-01T21:57:29.802 [Information] The type initializer for 'System.Data.SqlClient.TdsParser' threw an exception.
2021-02-01T21:57:29.803 [Information] System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.TdsParser' threw an exception.---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SNILoadHandle' threw an exception.---> System.DllNotFoundException: Unable to load DLL 'sni.dll' or one of its dependencies: The specified module could not be found. (0x8007007E)at System.Data.SqlClient.SNINativeMethodWrapper.SNIInitialize(IntPtr pmo)at System.Data.SqlClient.SNILoadHandle..ctor()at System.Data.SqlClient.SNILoadHandle..cctor()--- End of inner exception stack trace

У меня есть некоторые ограничения, поэтому я перечислю их:

  • Невозможно использовать Visual Studio/Visual Studio Code.
  • Может развиваться только на портале
  • Не могу переключиться на среду выполнения ~2
  • Не могу создать новые ресурсы

Вот что я пробовал до сих пор

  • Вместо этого используйте Microsoft.Data.SqlClient> Я не могу устанавливать пакеты. (Ссылка на пакет успешно устанавливает его, но при компиляции он отображается как отсутствующий)
  • Создал файл function.proj и перечислил ссылки на пакеты> Он запускает и восстанавливает пакеты, но они, похоже, не используются моим run.csx.
  • Удалены и добавлены пакеты с dotnet add package System.Data.SqlClient.

Что работает:

  • Строка подключения> Я успешно выполнил запрос с помощью sqlcmd в консоли.

Мои вопросы:

  • Есть ли способ скопировать sni.dll из папки \shared\Microsoft.AspNetCore.App\2.2.14 в папку \shared\Microsoft.AspNetCore.App\3.1.11? (без успеха через консоль, запрещено)

  • Как я могу указать/установить пользовательские или определенные библиотеки через портал Azure? (например, #r "Newtonsoft.Json" или #load "file.csx")

  • Нужно ли упоминать файл function.proj, который я создал, в моем файле run.csx, чтобы он работал? Как?

1 ответ

Я вручную переключил параметр приложения «FUNCTION_EXTENSION_VERSION» на 2 вместо 3. Что изменило настройки версии Runtime функции на ~2.

И теперь функция работает корректно!

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