【问题标题】:Azure webjobs JobHostConfiguration missing and can't figure out to do the settings nowAzure webjobs JobHostConfiguration 缺失,现在无法进行设置
【发布时间】:2019-05-02 11:20:50
【问题描述】:

我想将我当前的 webjobs 配置重写为 3.0 版,但我无法让它与文档一起使用,因为我不知道如何在没有配置文件的情况下设置 dashboardconnectionstringstorageconnectionstring

JobHostConfiguration config = new JobHostConfiguration
{
    NameResolver = new WebJobsNameResolver()
};

string defaultStorageConnectionString = string.Format( "Some dynamically generation string" );
config.DashboardConnectionString = defaultStorageConnectionString;
config.StorageConnectionString = defaultStorageConnectionString;

using(JobHost host = new JobHost(config))
{
    // The following code ensures that the WebJob will be running continuously
    host.RunAndBlock();
}

我想让它使用正确的存储和仪表板连接字符串连续运行,而不使用配置文件。

【问题讨论】:

    标签: c# .net azure azure-webjobssdk


    【解决方案1】:

    3.0.0 NuGet 包更新(非测试版)带来了重大变化。它基于类似于 asp.net 主机的通用主机。您可以参考以下步骤:

    1.在你的program.cs中添加这行代码。

    .ConfigureAppConfiguration((context, config) => {
        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
    })
    

    Program.cs 中的全部代码。

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    namespace WebJob1template
    {
        class Program
        {
            static void Main()
            {
    
                var builder = new HostBuilder()
                    .UseEnvironment("Development")
                    .ConfigureAppConfiguration((context, config) => {
                        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                    })
                    .ConfigureWebJobs(
                    b =>
                    {
                        b.AddAzureStorageCoreServices()
                        .AddAzureStorage()
                        .AddTimers()
                        .AddFiles();
                        //.AddDashboardLogging();
                    })
                    .ConfigureLogging((context, b) =>
                    {
                        b.SetMinimumLevel(LogLevel.Debug);
                        b.AddConsole();
                    })
                    .UseConsoleLifetime();
    
    
                var host = builder.Build();
    
                using (host)
                {
                    host.Run();
                }
            }
        }
    }
    

    2.设置appsettings.json(注意设置它的属性Copy to Output DirectoryCopy always):

    {
      "ConnectionStrings": {
        "AzureWebJobsDashboard": "xxxx",
        "AzureWebJobsStorage": "xxxx"
      }
    }
    

    3.Functions.cs:

    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Logging;
    
    namespace WebJob1template
    {
        public class Functions
        {        
            public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger log)
            {
                //log.WriteLine(message);
                log.LogInformation(message);
            }
        }
    }
    

    4.输出:

    更多详情可以参考这个tutorial

    更新

    正如乔伊所说,我们可以使用

    config.AddInMemoryCollection(settings);
    

    public static Dictionary<string, string> settings = new Dictionary<string, string>
    {
        {"ConnectionStrings:AzureWebJobsDashboard:0", "xxxxxxx"},
        {"ConnectionStrings:AzureWebJobsStorage:1", "xxxxxx"},
    };
    

    这样它就不会使用配置文件。这里是关于如何使用AddInMemoryCollection的文章

    【讨论】:

    • 出于不同的原因,我不想使用 appsettings.json,但我找到了解决方案。我没有使用 AddJsonFile,而是使用了 AddInMemoryCollection( settings ),而 settings 只是一个带有设置的字典。
    【解决方案2】:

    扩展 Joey Cai 的回答,有可能不使用 JSON 配置文件:

    我们有:

    var storageAcc = "<< your connection string >>"
    var jobHostConfig = new JobHostConfiguration(storageAcc);
    var host = new JobHost(jobHostConfig);
    host.RunAndBlock();
    

    现在:

    var storageAcc = "<< your connection string >>"
    var settings = new Dictionary<string, string>
    {
        {"AzureWebJobsDashboard", storageAcc},
        {"AzureWebJobsStorage", storageAcc},
    };
    
    var builder = new HostBuilder();
    builder.ConfigureAppConfiguration((context, config) =>
    {
        config.AddInMemoryCollection(settings);
    });
    
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
    });
    
    var host = builder.Build();
    
    using (host)
    {
        await host.RunAsync();
    }
    

    是的。顺便说一句,多么漂亮的代码啊。 讽刺>

    我的版本和 Joey 作为答案更新发布的版本之间的主要区别在于我的字典必须包含密钥

    "AzureWebJobsStorage"
    

    而不是

    "ConnectionStrings:AzureWebJobsStorage:0"
    

    停止抱怨。这样我们就可以使用与以前相同的配置管理。

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多