升级 .net8 后 - 获取“错误索引方法‘FunctionName’未解析为值”

问题描述 投票:0回答:1

请帮我解决这个问题。

升级.Net8 Azure功能之前一切都运行顺利。

升级Net 8.0功能后出现以下错误

enter image description here

在 Azure 门户上,所有功能的环境变量均已禁用[false]。

注意:他们使用 AzureWebJob."FunctionName".Disabled 进行分配

在使用.net8升级期间,它删除了所有Azure.WebJobs库并在local.setting.json中添加了Azure.Functions.Worker

enter image description here

enter image description here

注意:函数工作线程运行时是“dotnet-isolated”

enter image description here

下面是host.json的屏幕截图 enter image description here

Belo 是我如何为计时器函数和 HTTP 函数 .Net 6 和 .Net 8 编写函数的代码 [它在 .Net 6 中工作]

enter image description here

enter image description here

这是Program.cs

using Microsoft.Extensions.Hosting;

 var host = new HostBuilder()
            .ConfigureFunctionsWebApplication()
            .ConfigureFunctionsWorkerDefaults()
            .Build();

    host.Run();

这是来自EmailAlert.cs文件[函数代码定时器和HTTP函数]

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using GatewayFunctions.Services;
using Microsoft.Data.SqlClient;
using System.Collections.Generic;
using System.Data;
using MassTransit;
using System.Linq;
using static 
Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext;
using Microsoft.Azure.Functions.Worker;

namespace GatewayFunctions.Function
 {
      public class EmailAlertOnPasswordExpiration
      {
             private readonly ISendEndpointProvider 
             sendEndpointProvider;
             private GatewayFunctionSettingProvider settings;

      public EmailAlertOnPasswordExpiration(ISendEndpointProvider 
      SendEndpointProvider, GatewayFunctionSettingProvider settings)
      {
           this.sendEndpointProvider = SendEndpointProvider;
           this.settings = settings;
       }
[Function("EmailAlertOnPasswordExpiration")]
public async Task           
       Run([TimerTrigger("%EmailAlertOnPasswordExpirationTrigger%")] 
            TimerInfo myTimer, ILogger log)
 {
     log.LogInformation($"EmailAlertOnPasswordExpire Timer trigger 
     function executed at: {DateTime.Now}");

   await PasswordExpiryUserList(log);
 }

[Function("EmailAlertOnPasswordExpirationGet")]
 public async Task<IActionResult> EmailAlertOnPasswordExpirationGet(
     [HttpTrigger(AuthorizationLevel.Function, "get", Route = "Email- 
    Alert")] HttpRequest req,ILogger log)
 {
    log.LogInformation($"EmailAlertOnPasswordExpire GET trigger 
      function executed at: {DateTime.Now}");

    await PasswordExpiryUserList(log);

    return new OkObjectResult("OK");

  }

我该如何处理这里的Startup.cs文件?

 class Startup : FunctionsStartup
 {
      private IConfiguration _configuration;

      public override void 
       ConfigureAppConfiguration(IFunctionsConfigurationBuilder 
        builder)
      {

             var cred = new ClientSecretCredential(Settings.TenantId, 
                   Settings.ClientId, Settings.ClientSecret);

     if (!string.IsNullOrEmpty(Settings.SecondaryAppConfigConnection))
     {
         builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
         {
             options.Connect(Settings.SecondaryAppConfigConnection)
              .ConfigureKeyVault(kv => kv.SetCredential(cred))
              .Select(KeyFilter.Any, LabelFilter.Null)
             .Select(KeyFilter.Any, Settings.Environment);
         }, true).AddAzureAppConfiguration(options =>
         {
             options.Connect(Settings.AppConfigConnection)
              .ConfigureKeyVault(kv => kv.SetCredential(cred))
              .Select(KeyFilter.Any, LabelFilter.Null)
             .Select(KeyFilter.Any, Settings.Environment);
         }, true);
     }
     else
     {

         builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
         {
             options.Connect(Settings.AppConfigConnection)
                 .ConfigureKeyVault(kv => kv.SetCredential(cred))
                 .Select(KeyFilter.Any, LabelFilter.Null)
                .Select(KeyFilter.Any, Settings.Environment);
         });
     }

     _configuration = builder.ConfigurationBuilder.Build();
     
 }

 public override void Configure(IFunctionsHostBuilder builder)
 {
     var settings = new GatewayFunctionSettingProvider(_configuration);
     var connectionString = settings.GetConnectionString();

     Endpoint.Utilities.Logging.LoggerHelpers.ConfigureSerilogForAzureFunctions(settings);

     builder.Services.AddAzureAppConfiguration();
     builder.Services.AddScoped<ICacheDataAdapter>(s => new RedisCacheDataAdapter(_configuration["RedisHost"]));
     builder.Services.AddSingleton<ICertificateManager>(s => new CertificateManager(settings, new RedisCacheDataAdapter(_configuration["RedisHost"]))); 
     builder.Services.AddSingleton<IMassTransitRequest<MonitorUserIdPoolRequest>>(s => new MassTransitRequest<MonitorUserIdPoolRequest>());
     builder.Services.AddSingleton(s => settings);
     builder.Services.AddSingleton<CoreSettingsProvider>(s => settings);
     builder.Services.AddSingleton<SettingsProvider>(s => settings);
     builder.Services.AddSingleton<IConnectionMultiplexer>(s => ConnectionMultiplexer.Connect(settings.RedisHost));
     builder.Services.AddScoped<IHiLoDataAdapter>(s => new HiLoDataAdapter(connectionString, settings.UserIdHiLoCapacity));
     builder.Services.AddScoped<IUserIdGenerationService, UserIdGenerationService>();
     builder.Services.AddMassTransitForAzureFunctions(cfg =>{}, "AzureWebJobsServiceBus");
     builder.Services.AddSingleton(Bus.Factory.CreateUsingAzureServiceBus(x => x.Host(settings.AzureWebJobsServiceBus)));
     builder.Services.AddLogging();
     builder.Services.AddSingleton(x => new BlobServiceClient(connectionString));
     builder.Services.AddFunctionsWorkerDefaults();
     SettingsProvider.RegisterCurrentProvider(() => settings);
 }

}

门户网站上的AzureFunction运行时版本。Azure站点

enter image description here

.net azure azure-functions azure-webjobs
1个回答
0
投票

注意:他们使用 AzureWebJob."FunctionName".Disabled 进行分配 -- 在升级.net8期间,它删除了所有Azure.WebJobs库并在local.setting.json中添加了Azure.Functions.Worker

  • 您需要在 Azure 门户中或使用 Azure CLI 更新运行时版本。这是正确的 Azure CLI 命令
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version ""

此命令将 Linux FX 版本设置为空字符串,这将有效删除 Linux 容器配置并允许 Azure Functions 应用程序在 Windows 上运行。

  • 如果您想在用 .NET 8 编写的 Azure 函数中同时拥有计时器触发器和 HTTP 触发器,您可以在同一类中的单独函数中或同一项目中的不同类中定义它们。

代码:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace YourNamespace
{
    public class YourFunctionClass
    {
        private readonly ISendEndpointProvider sendEndpointProvider;
        private readonly YourSettingsType settings;

        public YourFunctionClass(ISendEndpointProvider sendEndpointProvider, YourSettingsType settings)
        {
            this.sendEndpointProvider = sendEndpointProvider;
            this.settings = settings;
        }

        [Function("EmailAlertOnPasswordExpiration")]
        public async Task RunTimerTrigger([TimerTrigger("%EmailAlertOnPasswordExpirationSchedule%")] TimerInfo timerInfo, ILogger log)
        {
            log.LogInformation($"EmailAlertOnPasswordExpiration function executed at: {DateTime.Now}");

            // Your logic here for the Timer Trigger function
        }

        [Function("EmailAlertOnPasswordExpirationGet")]
        public async Task<IActionResult> RunHttpTrigger(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "EmailAlertOnPasswordExpiration")] HttpRequestData req,
            FunctionContext context)
        {
            var log = context.GetLogger("EmailAlertOnPasswordExpirationGet");

            log.LogInformation("HTTP trigger function processed a request.");

            // Your logic here for the HTTP Trigger function

            return new OkResult();
        }
    }
}
  • 您通常使用
    Startup
    类。在您的例子中,您已经定义了一个
    Startup
    类,它继承自
    FunctionsStartup
    。此类允许您为 Azure Functions 应用程序配置服务和设置。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.