禁用 属性 的 Azure Functions 在 Visual Studio 2017 中不起作用

Disable Property of Azure Functions not working in Visual Studio 2017

我有带计时器触发器的 Azure 函数。

public static void Run([TimerTrigger("0 */15 * * * *"), Disable("True")]TimerInfo myTimer, TraceWriter log)

此处 Disable("true") 无效。它生成 function.json 作为 "disabled": "True", 这是不正确的。应该是 "disabled": True, 禁用仅接受字符串值。 有什么办法可以改变这个吗?或任何其他禁用功能的方法?

字符串类型的值 - "disabled": "true" 也可以禁用该功能。测试结果如下。

这是我的函数定义。

public static void Run([TimerTrigger("0 */5 * * * *"),Disable("true")]TimerInfo myTimer, TraceWriter log)

这是 Azure 门户上发布的函数。

禁用属性默认值为 true

使用 Disable() 而不是 Disable("true")

所以代码看起来像

public static void Run([TimerTrigger("0 */15 * * * *"), Disable()]TimerInfo myTimer, TraceWriter log) .

如果要启用该功能,请使用 Disable("False")

您是否尝试修改解决方案中的 host.json?它具有以下属性供您指定在运行时加载哪些函数。

// Array of functions to load. Only functions in this list will be enabled.
// If not specified, all functions are enabled.
"functions": ["QueueProcessor", "GitHubWebHook"]

请注意,如果您的解决方案中有多个 Function App 项目,您还需要更改为它们对应的 host.json(即每个项目都有自己的拥有 host.json)

文档:https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json

功能 2.x 可以通过 local.settings.json 以下列方式单独禁用

{
    "IsEncrypted": false,
    "Values": {
    "AzureWebJobs.MyFunctionNameOne.Disabled": "true",
    "AzureWebJobs.MyFunctionNameTwo.Disabled": "true",
    ...
    }
}

参考:https://docs.microsoft.com/en-us/azure/azure-functions/disable-function#functions-2x---all-languages

我尝试使用 local.settings.json 来禁用,当在本地调试时,模拟器 window 实际上说命名函数已被禁用,但无论如何都会调用它!这在VS2017和2019中是一样的

我目前使用的解决方法是测试此应用程序设置作为我函数中的第一行并立即return:

    if(ConfigurationManager.AppSettings["AzureWebJobs.TimerTriggeredFunction.Disabled"] == "true") return;

我想添加这个答案,因为我也一直在搜索它,我相信我找到了一个很好的方法来禁用用于 debugging/development 目的的功能(并避免这些本地更改进入部署pipelines/source控制)。

我将 #if DEBUG 语句与 Disable(string SettingsName) 属性结合起来:

下面的一段代码展示了不同的工作原理:

  • Disable 属性不是使用参数来指示 True 或 False 作为值,而是指一个应用程序设置(您可以将其放入 local.settings.json 文件中)。请参阅此 post 中的第二个片段。因此,只需更改 appsettings 文件中的设置,我就可以轻松启用和禁用触发器,而不会影响我的 git 存储库或部署管道。
  • 另一个有趣的事情是使用 TimerTrigger 时的 RunOnStartup = true 参数。这个(我只使用 DEBUG 编译器指令启用)将允许我立即触发计时器功能,而无需等待下一个 CRON 周期发生。 (另一种方法是对本地函数端点执行 post,如 所述)。因此,再次假设您 运行 在 RELEASE 配置中的生产工作负载,这只会影响您的本地开发环境,而不影响您的开发团队或发布。

第一个片段(属性)

#if DEBUG
        [Disable("disable-transactioncrawler")]
#endif
        [FunctionName("TransactionCrawler")]
        public async Task Run([TimerTrigger("50 */10 * * * *"
#if DEBUG
                , RunOnStartup = true
#endif
            )]TimerInfo myTimer, ILogger log)
        {
                // Logic comes here
        }

第二个片段(local.appsettings.json)

{
  "Values": 
  {
    "disable-transactioncrawler": false
  }
}

以下 'solutions' 通常会影响您的生产代码,这可能会导致问题:

  • 仅使用 Disable() 不允许您之后 configure/change
  • 更新 host.json 文件以仅包含您想要的触发器 运行 也存在将此更改投入生产的风险。