如何在最新的Azure Webjob 3.03中指定AzureWebJobsStorage

时间:2019-01-04 16:49:43

标签: azure-webjobs azure-webjobssdk

我将旧的Azure Web作业代码更新为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();

2 个答案:

答案 0 :(得分: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();
            }
        }
    }
}

appsettings.json(请注意,将其属性“复制到输出目录”设置为始终复制):

{
  "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);
        }
    }
}

测试结果:

enter image description here

答案 1 :(得分:0)

我遇到了同样的问题,here is my solution

下面是我指的Azure程序集

enter image description here

通过上述设置,如果配置文件的名称为'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”文件的属性“ appsettings.json”。 @Ivan Yang在回答中已经提到了这一点。

enter image description here

Here是源代码的git hub链接。

注意:我遵循this documentation来实现代码库。