如何在最新的 azure webjob 3.03 中指定 AzureWebJobsStorage

How to specify AzureWebJobsStorage in latest azure webjob 3.03

我更新了旧的 azure webjob 代码以打包到 3.03,然后它就无法正常工作。

我设法修复了所有编译时错误,但是当 运行 在本地时,它会抛出此错误:

Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException
  HResult=0x80131500
  Message=Error indexing method 'MvQueueProcessorV2.ProcessMVRequest'
  Source=Microsoft.Azure.WebJobs.Host
  StackTrace:
   at Microsoft.Azure.WebJobs.Host.RecoverableException.TryRecover(ILogger logger) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Exceptions\RecoverableException.cs:line 81
   at FE.Toolkit.MvPaaS.WebJob.Program.<Main>(String[] args)

Inner Exception 1:
InvalidOperationException: Storage account 'Storage' is not configured.

对我来说,这似乎表明它找不到设置 AzureWebJobsStorage?但是,它在 app.config 文件中睡得很好。所以我假设我应该将我的连接字符串放入 appsettings.json,所以这就是我在 appsettings.json:

中所做的
{
  "ConnectionStrings": {
    "AzureWebJobsDashboard": "xxx",
    "Storage": "yyy"
  }
}

但是,它给了我同样的错误。那么如何为 webjob 3.0 设置存储?

这是我在 program.cs

中的代码
var builder = new HostBuilder()
              .UseEnvironment("Development")
              .ConfigureWebJobs(b =>
               {
                 b.AddAzureStorageCoreServices()
                   .AddAzureStorage()
                   .AddTimers()
                   .AddFiles()
                   .AddDashboardLogging();
                   })
                  .ConfigureLogging((context, b) =>
                 {
                   b.SetMinimumLevel(LogLevel.Debug);
                   b.AddConsole();
                  })
                   .ConfigureServices(services =>
                  {
                        services.AddSingleton<INameResolver, ConfigNameResolver>();
                  })
               .UseConsoleLifetime();

请在您的 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();
            }
        }
    }
}

appsettings.json(注意将其设置为 属性 "Copy to Output Directory" 始终复制):

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

Function.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);
        }
    }
}

测试结果:

我运行遇到了和here is my solution一样的问题。

下面是我所指的 Azure 程序集

使用上述设置,如果配置文件的名称是 'appSettings.json'

,则无需调用 c.AddJsonFile("appsettings.json", ... )

默认情况下,框架将查找名为“appsettings.json”的文件

但是,如果文件名是其他名称,我们需要告诉 HostBuilder 我们的配置文件的名称是什么。

HostBuilder builder = new HostBuilder();

//Below piece of code is not required if name of json file is 'appsettings.json'
builder.ConfigureAppConfiguration(c =>
{
   c.AddJsonFile("Myappsettings.json", optional: false, reloadOnChange: true);

});

在我的本地机器上调试时导致问题的简单而重要的步骤是“Copy to Output Directory'property of my 'appsettings.json”文件。 @Ivan Yang 在他的回答中已经提到了这一点。

Here是源代码的git枢纽link。

注意:我已经按照this documentation实现了代码库。