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

使用ListWebAppFunctionKeysArgs获取Azure函数应用API密钥失败求助

问题描述

使用Pulumi的ListWebAppFunctionKeys获取Azure函数应用的API密钥时,返回的Properties值始终为空,无法正确获取密钥。

原问题代码片段:

var json = await result.Content.ReadAsStringAsync();
var root = JsonConvert.DeserializeObject<JsonSupport.AzureFunctionItems.Root>(json);
var items = root.value.Select(async v => {

    var data = await ListWebAppFunctionKeys.InvokeAsync(new ListWebAppFunctionKeysArgs {
        Name = appName,
        FunctionName = v.properties.name,
        ResourceGroupName = resourceGroupName
    });

    return data.Properties; // Property values are null
});

解决方案

问题根源

  1. 错误访问返回字段:Pulumi的ListWebAppFunctionKeysResult并没有名为Properties的属性,密钥直接作为顶级属性存在(如Default、MasterKey),访问data.Properties自然会得到空值。
  2. 函数名称获取错误:从Azure Management API返回的函数对象中,函数的唯一标识名称是顶层的name字段,而非properties.name。
  3. 异步任务处理不当:使用Select(async)生成异步任务后,直接调用.Result会导致同步阻塞,可能引发死锁或异常。
  4. 冗余手动HTTP请求:自行调用Management API处理认证和请求,不如使用Pulumi内置的GetWebAppFunctions方法可靠。

修正后的代码

using Pulumi;
using Pulumi.AzureNative.Web;
using Pulumi.AzureNative.Web.Inputs;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public static class FunctionKeyHelper
{
    public static Output<Dictionary<string, string>> GetFunctionKeys(string resourceGroupName, FunctionApp functionApp)
    {
        return functionApp.Name.Apply(async appName =>
        {
            // 使用Pulumi内置方法获取函数列表,自动处理认证和API版本
            var webAppFunctions = await GetWebAppFunctions.InvokeAsync(new GetWebAppFunctionsArgs
            {
                Name = appName,
                ResourceGroupName = resourceGroupName
            });

            // 并行发起所有密钥获取请求
            var keyRetrievalTasks = webAppFunctions.Value.Select(async func =>
            {
                var functionKeys = await ListWebAppFunctionKeys.InvokeAsync(new ListWebAppFunctionKeysArgs
                {
                    Name = appName,
                    FunctionName = func.Name, // 使用正确的函数名称字段
                    ResourceGroupName = resourceGroupName
                });

                // 将函数名称与默认密钥配对,可根据需求替换为其他密钥(如MasterKey)
                return new KeyValuePair<string, string>(func.Name, functionKeys.Default!);
            });

            // 等待所有异步任务完成,避免同步阻塞
            var keyPairs = await Task.WhenAll(keyRetrievalTasks);

            // 转换为字典返回
            return keyPairs.ToDictionary(kv => kv.Key, kv => kv.Value);
        });
    }
}

关键说明

  • 使用Pulumi内置方法:GetWebAppFunctions替代手动HTTP请求,无需自行处理Bearer令牌和API版本,减少出错概率。
  • 正确访问密钥字段:直接使用functionKeys.Default或functionKeys.MasterKey获取对应密钥,而非不存在的Properties属性。
  • 异步任务正确处理:通过Task.WhenAll并行处理所有密钥获取请求,提升效率并避免同步阻塞问题。
  • 正确传递函数名称:使用函数对象的顶层Name字段作为FunctionName参数,确保API调用目标正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:25:34