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.

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