请帮我解决这个问题。
升级.Net8 Azure功能之前一切都运行顺利。
升级Net 8.0功能后出现以下错误
在 Azure 门户上,所有功能的环境变量均已禁用[false]。
注意:他们使用 AzureWebJob."FunctionName".Disabled 进行分配
在使用.net8升级期间,它删除了所有Azure.WebJobs库并在local.setting.json中添加了Azure.Functions.Worker
注意:函数工作线程运行时是“dotnet-isolated”
Belo 是我如何为计时器函数和 HTTP 函数 .Net 6 和 .Net 8 编写函数的代码 [它在 .Net 6 中工作]
这是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站点
注意:他们使用 AzureWebJob."FunctionName".Disabled 进行分配 -- 在升级.net8期间,它删除了所有Azure.WebJobs库并在local.setting.json中添加了Azure.Functions.Worker。
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version ""
此命令将 Linux FX 版本设置为空字符串,这将有效删除 Linux 容器配置并允许 Azure Functions 应用程序在 Windows 上运行。
代码:
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 应用程序配置服务和设置。