You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过编程方式控制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();
    }
}

关键说明

  1. 为什么修改function.json无效?
    • Azure Functions运行时会缓存配置,无服务器计划下实例不会自动重新加载修改后的文件,必须通过官方API触发配置更新。
  2. 身份验证配置
    • 本地开发:通过az login登录Azure CLI,SDK会自动获取凭据。
    • 生产环境:为应用分配托管身份,并授予该身份对Function App的Microsoft.Web/sites/functions/write权限。
  3. 新增配置项
    appsettings.json需要补充:
    • AzureSubscriptionId:Azure订阅ID
    • AzureResourceGroupName:Function App所在资源组名称
    • AzureFunctionAppName:Function App名称

内容的提问来源于stack exchange,提问作者mahad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:39:32