【问题标题】:FSharp.Data.SqlCient works locally but not on production serverFSharp.Data.SqlCient 在本地工作,但不在生产服务器上
【发布时间】:2017-07-17 14:14:01
【问题描述】:

我遇到了 FSharp.Data.SqlClient 的问题。我正在构建一个 Asp.net Core 完整框架 4.6 Web 应用程序。主要项目在 C# 中,它引用了 F# 中的几个项目。这些 F# 项目中的每一个都使用 FSharp.Data.SqlClient 进行数据访问。在本地运行应用程序时,一切正常,但是当我将它部署到天蓝色时,当 F# 代码尝试执行查询时,我收到错误“实例失败”。

我怀疑在某种程度上它与连接字符串的使用方式或 FSharp.Data.SqlClient 和实体框架之间的某种运行时冲突有关。实体框架在主要项目中处理成员数据,仅此而已。我必须在主项目的配置文件中专门添加一个连接字符串,以便引用的 F# 项目可以在运行时访问数据库。实体框架通过 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 文件中的连接字符串。也许有人可以向我解释,因为这可能是最好的解决方案。无论如何,我假设配置文件中的连接字符串在部署时没有通过手动插入生产服务器连接字符串,然后部署应用程序来更新。果然问题解决了,一切正常。所以,现在的问题是,在使用 appsettings.json 文件的核心应用程序中,让 FSharp.Data.SqlClient 正确连接到连接字符串的最佳方法是什么?我该如何处理这个问题?我需要有人带我完成它,因为我是新手。

当前状态

所以在意识到这确实是一个配置问题之后,现在的问题是如何通过我的 F# 项目从 appsettings.json 文件中正确检索连接设置。使用 FSharp.Data json 提供程序,我需要弄清楚如何正确定位 appsettings.json 文件以供生产和开发使用。 F# 项目如何在主项目中定位文件?我只是把事情复杂化了吗?

【问题讨论】:

  • 你的代码(处理连接字符串的位)是什么样的?
  • 你能在你使用FSharp.Data.SqlClient的地方添加代码吗?
  • 好的,也添加了该代码。
  • 嗯,你在创建它时将Admin.rtConnection 传递给命令,所以这对我来说似乎没问题!
  • 是的,我觉得这一定是服务器问题,因为正如我所说,本地一切正常。我什至在访问实时服务器数据库时在本地运行它,看看我是否可以重现错误但不能。再说一次,这可能只是我不知道的简单事情,因为我是新手。

标签: f# asp.net-core-1.1 fsharp.data.sqlclient


【解决方案1】:

您似乎正在寻找 App.config 来查找连接字符串。在部署时,这通常会被不同的 .dll.config 文件替换,尽管这似乎不是问题。 Azure App Service 连接字符串中的 DefaultConnection 是否不正确?除此之外,我建议从 appsettings.json 而不是 app.config 文件中解析连接字符串。

【讨论】:

  • 是的,这就是我现在所走的道路。有没有从 F# 执行此操作的首选方法。
  • 可以使用JsonProvider解析app settings.json文件。 type Settings = JsonProvider&lt;"appsettings.json"&gt;。这将为您提供对结构的键入访问权限。 fsharp.github.io/FSharp.Data/library/JsonProvider.html
  • 我该如何优雅地使用这个解决方案。我试图避免将文字连接字符串传递给每个查询函数。我知道必须有一种方法可以从 F# 访问运行时连接字符串。这是我在迁移到 asp.net 核心并遇到此问题之前通过 web 配置所做的。
  • 如何从我的 F# 项目中正确定位 appsetigs.json 文件以供开发和生产使用。不知何故,这一切现在看起来都过于复杂了。
猜你喜欢
  • 2016-11-05
  • 2021-12-28
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多