【问题标题】:Function App unable to fetch connection string函数应用程序无法获取连接字符串
【发布时间】:2021-04-20 06:50:02
【问题描述】:

我有以下文件夹结构

以下所有内容都在一个解决方案中:-

  1. API 项目(所有 API 相关的 Controller、Helper、Extension Methods)
  2. BLL 类库项目(适用于所有业务层逻辑)
  3. DAL 类库项目(这里有 EF Core Db 上下文类)。
  4. 模型类库(API 中使用的所有模型、EF 核心都添加到该库中)
  5. Function App Project(调用数据库进行检查的地方)

问题:- (1) 中有一个 API,它调用 Function App(5)。因此,为了进行 Db 检查和验证,我正在启动 Dbcontext()。

    using (var _dbcontext = new sampleDbcontext())
       {
         //Code to validate some Db check 
       }

sampleDbcontext 在 EFcore Dbcontext 类所在的 DAL 类库 (3) 中。所以默认有一个项目引用从 DAL 项目添加到函数应用项目。在 Dbcontext 类中,我有以下代码

public class sampleDbcontext : DbContext
    {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                if (!optionsBuilder.IsConfigured)
                {
                    optionsBuilder.UseSqlServer(Environment.GetEnvironmentVariable("DefaultConnection", EnvironmentVariableTarget.Process));
                }
            }
    }  

这个DefaultConnection 在 API 项目 (1) 中。即在appsettings.json 文件中。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Initial Catalog=sampleDb; Integrated Security=true;"
  }
}

函数每次执行时都会抛出错误Value cannot be null. (Parameter 'connectionString')。我真的不知道我错过了什么。

我已经从函数 App(5) 中添加了对 APi 项目(1) 的引用,仍然没有结果。参考树如下

  1. API 项目 --BLL(2) & 模型类库(4)
  2. BLL 类库 --DAL(3) & 模型类库(4)
  3. DAL 类库 -- 模型类库(4)
  4. 功能应用项目 --BLL类库(二)

起始项目是 API 项目 (1)。可能的问题在哪里?

【问题讨论】:

  • 也许我错了,但 appsettings.json 中的设置不能作为环境变量使用。同样在您的 appsettings.json 中,您具有结构 ConnectionStrings - DefaultConnection,但在您的代码中,您尝试获取 DefaultConnection。所以这似乎是错误。
  • 你的意思是 optionsBuilder.UseSqlServer(Environment.GetEnvironmentVariable("ConnectionStrings:DefaultConnection", EnvironmentVariableTarget.Process));
  • 但这对于其余所有 API 都按预期工作,其中没有 Function App 调用。这仅对调用函数应用程序的 API 失败。在 Dbcontext 中,我没有使用 IConfiguration ,因为它会让我需要额外的 DI。所以我正在使用 Environment.GetEnvironmentVariable("DefaultConnection", EnvironmentVariableTarget.Process)
  • 是的,如果您将Environment.GetEnvironmentVariable(...) 的结果放入它自己的变量中,在您调用options.UseSqlServer() 并在那里设置断点之前,您可以检查它是否包含所需的值。

标签: c# asp.net-core-webapi asp.net-core-3.1 azure-function-app


【解决方案1】:

我在函数应用启动中缺少 DbContext 的启动。当我如下创建 SampleDbcontext 时

using (var _dbcontext = new sampleDbcontext())
       {
         //Code to validate some Db check 
       }

sampleDbcontext() 在添加命名空间时工作正常,但没有为其分配对象实例。

每次调用 Empty 构造函数时,都没有提到 Db 连接字符串。连接基本上在override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)。它需要来自 Function App 的 StartUp Service Layer 注入,并且像往常一样 DI 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 2017-03-06
    • 2013-11-08
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多