FSharp.Data.SqlCient在本地工作,但不在生产服务器上工作

时间:2017-07-15 20:54:08

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

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

我怀疑在某种程度上它与连接字符串的使用方式有关,或者与FSharp.Data.SqlClient和Entity Framework之间的某种运行时冲突有关。实体框架在主项目中处理成员资格数据而不是其他任何内容。我必须专门为主项目中的配置文件添加一个连接字符串,以便引用的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 - 查找服务器/实例时出错   指定)

这对我来说很奇怪,因为使用的连接字符串与实体框架使用的连接字符串相同,似乎可以正常访问数据库。

新更新 好吧,我想我弄清楚发生了什么。我相信这绝对是一个配置问题。正如我之前所说,在开发过程中,我必须创建一个配置文件,以便创建FSharp.Data.SqlClient可以连接的连接字符串。我无法弄清楚如何连接到appsettings.json文件中的连接字符串。也许有人可以向我解释,因为这可能是最好的解决方案。无论如何,我后来假设配置文件中的连接字符串没有通过手动插入生产服务器连接字符串,然后部署应用程序而在部署时获得更新。果然这个问题消失了,一切正常。那么,现在问题是,在使用appsettings.json文件的核心应用程序中,将FSharp.Data.SqlClient正确连接到连接字符串的最佳方法是什么?我该如何处理这个问题?我需要有人来指导我,因为我是新手。

当前状态

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

1 个答案:

答案 0 :(得分:0)

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