FSharp.Data.SqlCient работает локально, но не на рабочем сервере
У меня проблема с FSharp.Data.SqlClient. Я создаю полнофункциональное веб-приложение Asp.net Core 4.6. Основной проект находится в C#, который ссылается на несколько проектов, которые находятся в F#. Каждый из этих проектов F# использует FSharp.Data.SqlClient для доступа к данным. При локальном запуске приложения все работает нормально, но при развертывании в Azure я получаю сообщение об ошибке "Ошибка экземпляра", когда код F# пытается выполнить запрос.
У меня есть подозрение, что каким-то образом это связано с тем, как используются строки подключения, или, может быть, каким-то образом конфликт времени выполнения между FSharp.Data.SqlClient и Entity Framework. Entity Framework находится в основном проекте для обработки данных о членстве и ничего больше. Я должен специально добавить строку подключения в файл конфигурации в основном проекте, чтобы указанные проекты F# могли обращаться к базе данных во время выполнения. Entity Framework использует свою строку данных через файл AppSettings.Json. Я не знаю, есть ли лучший способ подключить это, но опять же, это прекрасно работает, когда я запускаю его локально, а не на сервере, на котором он был развернут.
Есть ли что-то, что мне нужно включить или изменить по коду, чтобы приложение работало на рабочем сервере?
Вот вид моих строк данных. В моем проекте F# у меня есть файл app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data
Source=server code here"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
</startup>
</configuration>
В этом же проекте F# у меня есть еще один файл, который я использую для доступа к строке подключения во время выполнения:
module internal DbAdmin
open FSharp.Data
open FSharp.Configuration
module Admin =
// runtime connection string
type private Config = AppSettings<"App.config">
let rtConnection = Config.ConnectionStrings.DefaultConnection
В основном проекте C# у меня есть файл app.config:
<configuration>
<runtime>
<gcServer enabled="true"/>
</runtime>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=server
code here" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
и в appsettings.json настроен так:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=Server code Here"
}
}
это фактический код запроса:
type Select_AllArticles =
SqlCommandProvider<
"
select * from article.vw_AllArticlesAndDetails
", Admin.connectionString, ConfigFile = Admin.configFile
>
try
succeedWithMsg
(Select.Select_AllArticles.Create(Admin.rtConnection).Execute() |>
Seq.toList)
(createGoodMsg(OK("Some Success Message.")))
with
| ex -> fail (createBadMsg(DbError(ex.Message + " --selectAllArticles")))
** Обновление: ** После удаленной отладки приложения, это полное сообщение об ошибке, которое оно дает
При установке соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 26 - ошибка при поиске сервера / указан экземпляр)
Это странно для меня, поскольку используемая строка подключения - та же, что используется Entity Framework, которая, кажется, прекрасно обращается к базе данных.
Новое обновление Хорошо, думаю, я понял, что происходит. Я считаю, что это определенно проблема с конфигурацией. Итак, как я уже говорил ранее, при разработке мне нужно было создать файл конфигурации, чтобы создать строку подключения, к которой может подключаться FSharp.Data.SqlClient. Я не мог понять, как заставить его подключиться к строке подключения в файле appsettings.json. Возможно, кто-то может объяснить это мне, поскольку это может быть лучшим решением. Во всяком случае, я решил, что строка подключения внутри файла конфигурации не обновлялась при развертывании, вручную вставив строку подключения к производственному серверу, а затем развернув приложение. Конечно, проблема исчезла, и все работало нормально. Итак, теперь вопрос в том, как лучше всего правильно подключить FSharp.Data.SqlClient к строке подключения в основном приложении, которое использует файл appsettings.json? Как мне решить эту проблему? Мне нужен кто-то, чтобы провести меня через это, поскольку я новичок в этом.
Текущее состояние
Итак, после осознания того, что это действительно проблема конфигурации, теперь возникает вопрос: как мне правильно извлечь параметры подключения из файла appsettings.json через мои проекты F#. Используя провайдера FSharp.Data json, мне нужно выяснить, как правильно найти файл appsettings.json как для производственного использования, так и для разработки. Как проект F# может найти файл в основном проекте? Я просто слишком усложняю вещи?
1 ответ
Вы, кажется, ищете App.config, чтобы найти строку подключения. Это обычно заменяется другим файлом.dll.config при развертывании, хотя это не проблема. Есть ли в ваших строках соединения службы приложений Azure значение DefaultConnection, которое неверно? Кроме этого, я бы предложил проанализировать строку подключения из файла appsettings.json, а не из файла app.config.