Строка подключения SqlDataProvider в Suave на Azure

Я не могу заставить работать SqlDataProvider при выполнении в сценарии fsx, который выполняется на веб-сайте Azure.

Я начал с образцов, которые есть у Томаса Петречека здесь: https://github.com/tpetricek/Dojo-Suave-FsHome.

Короче говоря, это сценарий FSX, который выполняется с использованием IIS httpPlatformHandler, поэтому все запросы http на мой веб-сайт Azure перенаправляются на мой сценарий F#.

Скрипт F# использует Suave для обработки запросов.

Когда я попытался добавить доступ к базе данных для моих обработчиков HTTP, у меня возникли проблемы.

Проблемный код выглядит следующим образом:

[<Literal>]
let connStr = "Server=(localdb)\\v11.0;Initial Catalog=My_Database;Integrated Security=true;" 
[<Literal>]
let resolutionFolder = __SOURCE_DIRECTORY__
FSharp.Data.Sql.Common.QueryEvents.SqlQueryEvent |> Event.add (printfn "Executing SQL: %s")

// the following line fails when executing in azure
type db = SqlDataProvider<connStr, Common.DatabaseProviderTypes.MSSQLSERVER, ResolutionPath = resolutionFolder>

let saveData someDataToSave =
  let ctx = db.GetDataContext(Environment.GetEnvironmentVariable("SQLAZURECONNSTR_QUERIES"))
  .....
  /// code using the context here

Это работает очень хорошо, когда я запускаю его локально, но когда я разверну его на сайте Azure, он потерпит неудачу на линии, где type dbсоздано.

Сообщение об ошибке (строка 70 - это строка, которая имеет type db = ...:

D: \ home \ site \ wwwroot \ app.fsx (70,11): ошибка FS3033: поставщик типа 'FSharp.Data.Sql.SqlTypeProvider' сообщил об ошибке: при установлении ошибки произошла ошибка сети или экземпляра подключение к SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 52 - невозможно найти установку локальной базы данных времени выполнения. Убедитесь, что SQL Server Express установлен правильно и что функция локальной базы данных времени выполнения включена.)

База данных времени разработки в connStr недоступен на лазурном сайте, но я подумал, что именно поэтому мы имеем GetDataContext перегрузка, которая принимает строку подключения для использования во время выполнения?

Это потому, что он работает как скрипт, а не как скомпилированный код, он пытается получить доступ к базе данных при создании TypeProvider? Если да, значит ли это, что мой единственный вариант - это скомпилировать и предоставить код базы данных в виде скомпилированной сборки, которую я загружаю и использую в своем скрипте Suave FSX?

Чтение строки подключения из файла конфигурации не очень хорошо работает, так как это происходит на сайте Azure. Мне действительно нужно получить строку подключения из переменной среды (которая задается в интерфейсе управления Azure).

1 ответ

Решение

Хм, это немного прискорбно - как @Fyodor упомянул в комментариях, проблема в том, что развертывание на основе сценариев в Azure фактически компилирует сценарий на компьютере Azure - и поэтому вам нужно иметь статически разрешенную строку подключения, которая работает на Лазурном.

Есть два варианта:

  1. Вместо этого используйте скомпилированный проект. Если вы скомпилируете свой код F# локально и развернете скомпилированный код в Azure, он будет работать. К сожалению, хороших образцов для этого нет.

  2. Сделайте хитрый трюк, чтобы сделать строку подключения доступной для скрипта во время компиляции.

  3. Отправьте PR провайдеру SQL, чтобы вы могли присвоить ему имя переменной среды, и он оттуда прочитает строку соединения.

Я думаю (3) на самом деле было бы довольно приятной и полезной функцией.

Я не обязательно уверен, что лучший способ сделать (2) будет. Но я думаю, что вы могли бы изменить app.azure.fsx так что он создает файл (скажем, connection.fsx) который содержит что-то вроде:

module Connection
let [<Literal>] ConnString = "<Contents of SQLAZURECONNSTR_QUERIES>"

затем app.fsx мог загрузить этот скрипт и использовать Connection.ConnString в аргументе поставщика типа SQL.

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