无法通过编程方式控制Azure Function App函数启用/禁用状态
问题描述
我尝试通过编程方式启用/禁用Azure Function App中的函数,用C#编写了AzureFunctionsHelper类,通过修改function.json文件的disabled字段实现操作。虽然function.json文件的disabled属性已成功修改,但函数的实际运行状态并未随之改变。
相关代码
AzureFunctionsHelper类
public class AzureFunctionsHelper { private static string azureFunctionURL = string.Empty; private static string azureFunctionUsername = string.Empty; private static string azureFunctionPassword = string.Empty; private static List<string> azureFunctionNames = new List<string>(); private WebClient _webClient; public AzureFunctionsHelper() { if (azureFunctionURL == string.Empty || azureFunctionUsername == string.Empty || azureFunctionPassword == string.Empty) { setParameters(); } _webClient = new WebClient { Headers = { ["ContentType"] = "application/json" }, Credentials = new NetworkCredential(azureFunctionUsername, azureFunctionPassword), BaseAddress = azureFunctionURL }; } public void SetAzureFuncDisabled(bool isDisabled) { try { foreach(var functionName in azureFunctionNames) { string conUri = _webClient.BaseAddress + $"/{functionName}/function.json"; var functionJson = JsonConvert.DeserializeObject<FunctionSettings>(_webClient.DownloadString(conUri)); functionJson.disabled = isDisabled; _webClient.Headers["If-Match"] = "*"; _webClient.UploadString(conUri, "STOR", JsonConvert.SerializeObject(functionJson)); } } catch (Exception ex) { throw ex; } } private static string GetFunctionJsonUrl(string functionName) { try { return $"{functionName}/function.json"; } catch (Exception ex) { throw ex; } } public void setParameters() { try { var filePath = Path.Combine(System.AppContext.BaseDirectory, "appsettings.json"); azureFunctionURL = ReaderHelper.Read(filePath, "AzureFunctionAppURL"); azureFunctionUsername = ReaderHelper.Read(filePath, "AzureFunctionUsername"); azureFunctionPassword = ReaderHelper.Read(filePath, "AzureFunctionPassword"); var values = ReaderHelper.Read(filePath, "AzureFunctionNames"); azureFunctionNames = values.Split(", ").ToList(); // 已成功修改function.json的disabled属性,但函数实际状态无变化 } catch (Exception ex) { throw ex; } } }
实体类
internal class FunctionSettings { public string generatedBy { get; set; } public string configurationSource { get; set; } public List<Binding> bindings { get; set; } public bool disabled { get; set; } public string scriptFile { get; set; } public string entryPoint { get; set; } } internal class Binding { public string type { get; set; } public List<string> methods { get; set;} public string authLevel { get; set; } public string name { get; set; } }
解决方案
直接修改function.json文件无法触发Azure Functions运行时的配置刷新,尤其是消耗/弹性高级计划下,函数实例会缓存旧配置。正确做法是使用Azure官方管理API或SDK直接更新函数状态。
步骤1:安装NuGet依赖
Install-Package Microsoft.Azure.Management.Functions -Version 4.1.0 Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.6.2
步骤2:重写Helper类
using Microsoft.Azure.Management.Functions; using Microsoft.Azure.Management.Functions.Models; using Microsoft.Azure.Services.AppAuthentication; using Microsoft.Rest; using System.Threading.Tasks; public class AzureFunctionsHelper { private static string subscriptionId = string.Empty; private static string resourceGroupName = string.Empty; private static string functionAppName = string.Empty; private static List<string> azureFunctionNames = new List<string>(); private FunctionManagementClient _functionClient; public AzureFunctionsHelper() { if (string.IsNullOrEmpty(subscriptionId) || string.IsNullOrEmpty(resourceGroupName) || string.IsNullOrEmpty(functionAppName) || !azureFunctionNames.Any()) { setParameters(); } // 身份验证:本地用Azure CLI登录,生产用托管身份 var tokenProvider = new AzureServiceTokenProvider(); var accessToken = tokenProvider.GetAccessTokenAsync("https://management.azure.com/").Result; var credentials = new TokenCredentials(accessToken); _functionClient = new FunctionManagementClient(credentials) { SubscriptionId = subscriptionId }; } public async Task SetAzureFuncDisabled(bool isDisabled) { foreach (var functionName in azureFunctionNames) { var functionConfig = await _functionClient.Functions.GetAsync(resourceGroupName, functionAppName, functionName); functionConfig.Config.IsDisabled = isDisabled; await _functionClient.Functions.CreateOrUpdateAsync(resourceGroupName, functionAppName, functionName, functionConfig); } } private void setParameters() { var filePath = Path.Combine(System.AppContext.BaseDirectory, "appsettings.json"); subscriptionId = ReaderHelper.Read(filePath, "AzureSubscriptionId"); resourceGroupName = ReaderHelper.Read(filePath, "AzureResourceGroupName"); functionAppName = ReaderHelper.Read(filePath, "AzureFunctionAppName"); var values = ReaderHelper.Read(filePath, "AzureFunctionNames"); azureFunctionNames = values.Split(", ").ToList(); } }
关键说明
- 为什么修改function.json无效?
- Azure Functions运行时会缓存配置,无服务器计划下实例不会自动重新加载修改后的文件,必须通过官方API触发配置更新。
- 身份验证配置
- 本地开发:通过
az login登录Azure CLI,SDK会自动获取凭据。 - 生产环境:为应用分配托管身份,并授予该身份对Function App的
Microsoft.Web/sites/functions/write权限。
- 本地开发:通过
- 新增配置项
appsettings.json需要补充:AzureSubscriptionId:Azure订阅IDAzureResourceGroupName:Function App所在资源组名称AzureFunctionAppName:Function App名称
内容的提问来源于stack exchange,提问作者mahad
相关产品推荐
相关产品推荐

