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 использует свою строку данных через файл 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

В основном проекте С# у меня есть файл 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# может найти файл в основном проекте? Я просто слишком все усложняю?


person user1206480    schedule 15.07.2017    source источник
comment
Как выглядит ваш код (фрагменты, связанные со строками подключения)?   -  person Tomas Petricek    schedule 16.07.2017
comment
Можете ли вы также добавить код, где вы используете FSharp.Data.SqlClient?   -  person Tomas Petricek    schedule 16.07.2017
comment
Хорошо добавил этот код.   -  person user1206480    schedule 16.07.2017
comment
Хм, вы передаете Admin.rtConnection команде при ее создании, так что мне этот бит кажется нормальным!   -  person Tomas Petricek    schedule 16.07.2017
comment
Да, я чувствую, что это проблема с сервером, потому что, как я уже сказал, локально все работает нормально. Я даже запускал его локально при доступе к базе данных живого сервера, чтобы посмотреть, смогу ли я воспроизвести ошибку, но не смог. С другой стороны, это может быть просто что-то простое, о чем я не знаю, поскольку я новичок в этом.   -  person user1206480    schedule 16.07.2017
comment
Включен ли для экземпляра SQL Server доступ к службам Azure? docs.microsoft.com/en-us/ azure/sql-база данных/   -  person Tomislav Markovski    schedule 16.07.2017
comment
Да, я так думаю, так как я могу войти в систему, которая контролируется Entity Framework. Проблема появляется только тогда, когда задействован FSharp.Data.SqlClient. Я не знаю. Я даже добавил FSharp.configuration и FSharp.Data.SqlClient в основной проект C# через nuget, просто чтобы убедиться, что они доступны для кода, и все равно возникали те же проблемы.   -  person user1206480    schedule 16.07.2017
comment
@TomislavMarkovski Я выполнил удаленную отладку и получил полное сообщение об ошибке. Это намекает на вашу точку зрения, что существует проблема с доступом, но если это так, я не понимаю, почему Entity Framework может получить доступ к базе данных. Кроме того, изучив предоставленные документы Azure, я не смог точно понять, как предоставить какой-либо доступ к серверу. Я имею в виду, что он говорит об IP-адресах, но мне все еще не ясно, что я должен искать, чтобы включить.   -  person user1206480    schedule 16.07.2017
comment
Возможно ли, что при развертывании приложения строка подключения, определенная в app.config, никогда не обновляется, что, в свою очередь, по-прежнему указывает FSharp.Data.SqlClient на локальный сервер?   -  person user1206480    schedule 16.07.2017
comment
Пожалуйста, ознакомьтесь с последним обновлением выше, так как я думаю, что понял корень проблемы.   -  person user1206480    schedule 16.07.2017
comment
Там установлен флажок Разрешить доступ к службам Azure для доступа к базе данных. Это на том же экране, где вы устанавливаете адреса брандмауэра. По ссылке, которую я разместил, есть скриншот настройки. Также возможно, что в строке подключения может возникнуть проблема, которую вы описали. Вы можете попробовать жестко запрограммировать его.   -  person Tomislav Markovski    schedule 16.07.2017
comment
blog.elmah.io/appsettings-in-aspnetcore   -  person Tomislav Markovski    schedule 16.07.2017
comment
Вы передаете строку подключения во время выполнения в Create, поэтому поставщик типов не использует файл конфигурации во время выполнения, по крайней мере, напрямую.   -  person Dmitry Sevastianov    schedule 16.07.2017
comment
Сейчас я пытаюсь правильно найти appsettings.json из F#. См. обновление выше.   -  person user1206480    schedule 17.07.2017


Ответы (1)


Похоже, вы ищете App.config, чтобы найти строку подключения. Обычно при развертывании он заменяется другим файлом .dll.config, хотя, похоже, это не проблема. Есть ли у вас неверное значение DefaultConnection в строках подключения службы приложений Azure? Кроме этого, я бы предложил анализировать строку подключения из файла appsettings.json, а не из файла app.config.

person Ryan Riley    schedule 16.07.2017
comment
Да, это путь, по которому я сейчас иду. Есть ли предпочтительный способ сделать это из F #. - person user1206480; 16.07.2017
comment
Вы можете использовать JsonProvider для разбора файла app settings.json. type Settings = JsonProvider<"appsettings.json">. Это даст вам типизированный доступ к структуре. fsharp.github.io/FSharp.Data/library/JsonProvider.html - person Tomislav Markovski; 17.07.2017
comment
Как мне элегантно использовать это решение. Я пытаюсь избежать передачи буквальной строки подключения каждой функции запроса. Я знаю, что должен быть способ получить доступ к строке подключения во время выполнения из F#. Это то, что я делал через веб-конфигурацию, прежде чем перейти к ядру asp.net и столкнуться с этой проблемой. - person user1206480; 17.07.2017
comment
Как правильно найти файл appettigs.json в моем проекте F# как для разработки, так и для использования в рабочей среде. Как-то это все сейчас кажется чересчур сложным. - person user1206480; 17.07.2017