当前位置: 首页 > 知识库问答 >
问题:

如何将appsettings.json文件添加到我的Azure Function 3.0配置?

孟修竹
2023-03-14

新的 Azure 函数 3.0 SDK 提供了一种实现启动类的方法。它允许访问通过依赖关系注入可用的服务集合,我可以在其中添加自己的组件和第三方服务。

但是我不知道如何使用配置文件。

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
...

我的第三方服务将大型结构作为参数,这些配置文件使用二进制文件进行复制。我可以将它们复制到appsettings.json文件的子部分中:

{
  "MachineLearningConfig" : {
     ( about 50+ parameters and subsections )
  }
}

配置值根据部署环境进行更新。我使用 Azure DevOps 的文件转换任务:生产值与暂存和开发值不同。

给定文档https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection加载这些选项的方法是:

builder.Services.AddOptions<MachineLearningConfig>()
                .Configure<IConfiguration>((settings, configuration) =>
                                           {
                                                configuration.GetSection("MachineLearningConfig").Bind(settings);
                                           });

但这需要在主机环境中将所有设置添加为键/值字符串,而这正是我不想做的。它们太多了,这并不像在json配置文件中那样容易维护。

我在host.json.旁边复制了appsettings.json

但是应用程序设置。Azure函数SDK在启动时读取的json文件不是我的应用程序的appsettings。json,但Azure函数工具的appsettings.json。所以<code>配置。GetSection(“MachineLearningConfig”)返回空值,因为没有appsettings。Azure函数工具bin文件夹中的json文件。

因此,我的问题是:如何从我的应用程序设置中读取我的MachineLearningConfig部分。json文件作为<code>IOption注入

共有3个答案

东郭元魁
2023-03-14

用这个。网芯3.1和Azure功能3。花了< s >小时天。这是我想到的。

[assembly: FunctionsStartup(typeof(Ugly.AzureFunctions.Startup))]

namespace Ugly.AzureFunctions
{
    class Startup : FunctionsStartup
    {
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            try
            {
                // On Azure, we need to get where the app is.
                // If you use Directory.GetCurrentDirectory(), you will get something like D:\Program Files (x86)\SiteExtensions\Functions\3.0.14785\32bit
                var basePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "..");
                var environmentName = builder.GetContext().EnvironmentName;
                builder.ConfigurationBuilder
                    .SetBasePath(basePath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
                    .AddEnvironmentVariables();
            }
            catch (Exception ex)
            {
                // Handle exceptions about this. Which __should__ never ever happen.
                // The previous comment is sarcastic.
                throw;
            }
        }

        public override void Configure(IFunctionsHostBuilder builder)
        {
            try
            {
                // DO NOT add the configuration as Singleton.
                // If you need the IConfiguration:
                //var configuration = builder.GetContext().Configuration;

                builder.Services
                    .AddOptions<MachineLearningConfig>()
                    .Configure<IConfiguration>((settings, configuration) => {
                        configuration.GetSection("MachineLearningConfig").Bind(settings);
                });
            }
            catch (Exception ex)
            {
                // Handle or not handle? That's the question.
                throw;
            }
        }
    }
}
邓夕
2023-03-14

Nkosi的解决方案运行得很好,但它确实通过替换IConfiguration单例来更新azure函数运行时加载自身设置的方式:services.AddSingleton

我更喜欢另一个未注入的IConfigurationRoot。我只需要注入我的设置 IOption

我构建了另一个IConfigurationRoot,它是Startup类的成员:

public class Startup : FunctionsStartup
{
    private IConfigurationRoot _functionConfig = null;

    private IConfigurationRoot FunctionConfig( string appDir ) => 
        _functionConfig ??= new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(appDir, "appsettings.json"), optional: true, reloadOnChange: true)
            .Build();

    public override void Configure(IFunctionsHostBuilder builder)
    {
         builder.Services.AddOptions<MachineLearningSettings>()
             .Configure<IOptions<ExecutionContextOptions>>((mlSettings, exeContext) =>
                 FunctionConfig(exeContext.Value.AppDirectory).GetSection("MachineLearningSettings").Bind(mlSettings) );
    }
}

注意:连接字符串必须保留在应用程序设置中,因为触发器需要它来创建未启动的函数应用程序的实例(在消费服务计划中)。

经博延
2023-03-14

在Azure Functions v3中,您可以使用<code>appsettings。来自ASP.NET的json配置模式。NET核心与下面的<code>ConfigureAppConfiguration

此外,使用下面的配置方法中的代码更改添加选项的方式。您不应该将IConfiguration传递给IServiceProvider.Configure

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;

[assembly: FunctionsStartup(typeof(Startup))]

namespace MyAzureFunction
{
    public class Startup : FunctionsStartup
    {
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            if (builder == null) throw new ArgumentNullException(nameof(builder));

            var context = builder.GetContext();

            builder.ConfigurationBuilder
                .AddAppsettingsFile(context)
                .AddAppsettingsFile(context, useEnvironment: true)
                .AddEnvironmentVariables();
        }

        public override void Configure(IFunctionsHostBuilder builder)
        {
            if (builder == null) throw new ArgumentNullException(nameof(builder));

            var configuration = builder.GetContext().Configuration;

            builder.Services.Configure<MachineLearningConfig>(options =>
            {
                configuration.GetSection("MachineLearningConfig").bind(options);
            });
        }
    }

    public static class ConfigurationBuilderExtensions
    {
        public static IConfigurationBuilder AddAppsettingsFile(
            this IConfigurationBuilder configurationBuilder,
            FunctionsHostBuilderContext context,
            bool useEnvironment = false
        )
        {
            if (context == null) throw new ArgumentNullException(nameof(context));

            var environmentSection = string.Empty;

            if (useEnvironment)
            {
                environmentSection = $".{context.EnvironmentName}";
            }

            configurationBuilder.AddJsonFile(
                path: Path.Combine(context.ApplicationRootPath, $"appsettings{environmentSection}.json"),
                optional: true,
                reloadOnChange: false);

            return configurationBuilder;
        }
    }
}

 类似资料:
  • 我有一个当地的库伯内特斯环境,我基本上是复制的。将kube/config文件添加到我的本地文件中,并将“上下文”、“用户”和“集群”信息添加到我当前的“.kube/config”文件中。没关系,我可以连接到本地文件。 但是我想用命令将这些信息添加到我的本地配置文件中。 因此,关于这个页面,我可以使用“证书颁发机构数据”作为参数,如下所示:--- 但它会抛出如上所述的错误。我用的是kubernete

  • 问题内容: 我想将先前从其他文件(已经完成)中提取的一系列文件添加到jar中。这些文件将覆盖JAR中的文件。最有效的方法是什么?我需要它快。谢谢! 问题答案: 请记住,JAR文件是ZIP文件。 只需使用一些ZIP库。

  • 问题内容: Eclipse设置为在“ bin”处编译为构建目录。我有一个包含各种Java .class文件(预编译)的文件夹结构,我想在编译时将其复制到文件夹“ bin”中。 如何告诉Eclipse自动执行此操作? 问题答案: 项目属性中“ Java构建路径”下的“添加类文件夹…”和“添加外部类文件夹…”按钮似乎完全可以满足您的要求。

  • 我使用FOP-2.1从xml和xsl-fo生成PDF文件,并花了很多时间来配置fop配置文件(我使用西里尔字体),根据https://xmlgraphics.apache.org/fop/2.1/configuration.html 在命令行中测试了它,它工作正常: fop-c conf.xml-xml xml.xsl xsl-pdfpdf 接下来,我需要在javaweb应用程序中执行同样的操作。

  • 问题内容: 如何将servlets API添加到项目的pom.xml中 mvnrepository.com有很多servlet api和名称类似的项目,我不知道哪个是正确的。还是所有人都还好吗? 问题答案: 我相信大多数Web /应用程序服务器都捆绑了servlet api版本,因此您不希望将api捆绑到.war文件中。您需要找出服务器随附的版本,然后才能使用 用您的版本替换servlet-api

  • 问题内容: 我正在尝试将一些文件添加到ZIP文件中,它会创建文件,但不会在其中添加任何内容。代码1: 我的功能: 编辑: 我发现了问题,只是在将文件从C:\驱动器写入F:\驱动器的ZIP时遇到麻烦 问题答案: 您不能压缩文件夹,只能压缩文件。要压缩文件夹,必须手动添加所有子文件。我写了本课来完成这项工作。您可以免费获得它:) 用法是这样的: 这是课程: 请享用! 编辑 :要检查程序是否仍在忙,可以