代码之家  ›  专栏  ›  技术社区  ›  user2439903

azure webjob:读取appSettings.json并将配置注入TimerTrigger

  •  0
  • user2439903  · 技术社区  · 6 年前

    从webjob中的appSettings.json文件读取配置值时遇到问题。webjob使用以下nuget包:

    enter image description here

    我的控制台应用程序(webjob)中有两个设置文件: appsettings.development.json appsettings.production.json

    在Main方法中,webjob的配置如下:

     static void Main(string[] args)
        {
            var builder = new HostBuilder()
                    .ConfigureWebJobs(webJobConfiguration =>
                    {
                        webJobConfiguration.AddTimers();
                        webJobConfiguration.AddAzureStorageCoreServices();  
                    })
                    .ConfigureAppConfiguration((hostingContext, config) =>
                     {
                         var env = hostingContext.HostingEnvironment;
                         Console.WriteLine("hostingContext.HostingEnvironment: " + env.EnvironmentName);
                         config.SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
                         .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
                         .AddEnvironmentVariables().Build();
                     })
                    .ConfigureServices((context, serviceCollection) =>
                    {
                        serviceCollection.AddSingleton<IConfiguration>(context.Configuration);
                        serviceCollection.AddTransient<SayHelloWebJob>(job => new SayHelloWebJob(context.Configuration));
                    })
                    .Build();
    
            builder.Run();
        }
    

    SayHelloWebJob的代码如下:

    public class SayHelloWebJob
    {
         static IConfiguration _configuration;
        public SayHelloWebJob(IConfiguration config)
        {
            _configuration = config;
            Console.WriteLine("Initialized SayHelloWebJob");
        }
    
        [Singleton]
        public static void TimerTick([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer)
        {
            Console.WriteLine($"From SayHelloWebJob: Hello at {DateTime.UtcNow.ToString()}");
            var test = _configuration.GetSection("WebJobConfiguration:message").Value;
            Console.WriteLine("Configuration access: message: " + test);
            Console.WriteLine("Configuration access: " + _configuration.GetSection("WebJobConfiguration:api").Value);
            Console.WriteLine("configuration object: "+ _configuration.GetConnectionString("AzureWebJobsStorage"));
    
        }
    }
    

    问题:

    1. 我有两个appSettings文件-用于开发&生产如何确保在生产过程中加载正确的文件?

    下面是appSettings.development.json文件示例:

    {
    "connectionStrings": {
        "AzureWebJobsStorage": stringhere",
        "AzureWebJobsDashboard": "stringhere"
    },
    "WebJobConfiguration": {
        "message": "I'm running locally!",
        "pfuWebApiUrl": "API link here",
        "api": "api here",
        "ApplicationInsights": {
            "InstrumentationKey": "key here"
        }
    }
    

    }

    2 回复  |  直到 6 年前
        1
  •  2
  •   Richard Fuller    6 年前

    我的首选是像您一样签入所有环境配置,并且完全可以根据环境在运行时加载正确的文件。

    首先在Visual Studio的“属性”窗格中将配置文件设置为“复制到更新版本的输出目录”,或者将其添加到csproj:

        <None Update="base.settings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
          <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </None>
        <None Update="prod.settings.json">
          <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </None>
    

            private static IConfigurationRoot GetConfiguration(string basePath)
            {
                string filename = Constants.IsAzureEnvironment ? "prod.settings.json" : "dev.settings.json";
    
                IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                    .SetBasePath(basePath)
                    .AddJsonFile("base.settings.json")
                    .AddJsonFile(filename);
    
                return configBuilder.Build();
            }
    

    我从azure函数的executionContext参数中获取basePath

            [FunctionName("Function1")]
            public static async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log, Microsoft.Azure.WebJobs.ExecutionContext context)
            {
                // context.FunctionAppDirectory
                return new OkResult();
            }
    
        2
  •  0
  •   Community CDub    4 年前

    Json.NET 读取json文件。

    这是我的json内容:

    {
       "object": {
          "name": "cwr"
       },
       "others": "123"
    }
    

    这是function.cs代码:

     public static void Run([TimerTrigger("0 */1 * * * *")] TimerInfo timer,
            ILogger logger)
        {
            
            JObject jsonData = JObject.Parse(File.ReadAllText(path));
    
            logger.LogInformation(jsonData["object"]["name"].ToString());
            logger.LogInformation(jsonData["others"].ToString());
    
        }
    

    这里是输出:

    enter image description here

    希望这能帮助你,如果你还有其他问题,请告诉我。