【问题标题】:Azure Function run code on startupAzure Function 在启动时运行代码
【发布时间】:2018-03-15 04:30:12
【问题描述】:

我正在尝试找到一种方法来在我的 Azure 函数启动时一次性运行一些代码(我在其中设置连接字符串、DI 和其他配置)。所以现在,它在生成的 function.json 中调用一个 Run 方法作为入口点:

"entryPoint": "MyFunctionApp.MessageReceiver.Run"

此 Run 方法使用 EventHubTrigger 并像这样处理传入的消息:

[FunctionName("MessageReceiver")]
        public static void Run([EventHubTrigger("eventHubName", Connection = "eventHubConnection")]string message, TraceWriter log)
        {
            if (string.IsNullOrWhiteSpace(message))
            {
                log.Info($"C# Event Hub trigger function processed a message: {message}");
            }
        }

有没有一种方法可以在调用此 Run 方法之前在初始启动时运行一些代码?或者有没有办法声明一个我可以在这个类之前调用​​的入口点,然后调用 Run() 并以某种方式传入触发器?我正在尝试找到一种方法来避免像设置布尔属性以查看应用程序是否已启动之类的骇人听闻的东西。

【问题讨论】:

标签: azure azure-functions


【解决方案1】:

在 2019 Build 大会上,微软发布了在 Azure Function 应用启动时拥有可调用方法的功能。这可用于注册 DI 类、创建静态 DB 连接等。

这些新功能的文档可以在Azure Function Dependency Injection找到

【讨论】:

  • 这只对 V2 azure 函数有效
【解决方案2】:

您可以实现 IExtensionConfigProvider。这些将被扫描并在“启动”时执行。

using Microsoft.Azure.WebJobs.Host.Config;
namespace MyFunctionApp
{
  public class Startup : IExtensionConfigProvider
  {
     public void Initialize(ExtensionConfigContext context)
     {
        // Put your intialization code here.
     }
  }
}

【讨论】:

  • 需要注意的重要一点是IExtensionConfigProvider 不会被加载,除非您在其中一个函数中使用自定义绑定,请参阅this answer
  • 我写了一篇关于逻辑、何时以及如何检测和实例化IExtensionConfigProvider 的帖子:blog.wille-zone.de/post/…
  • 感谢@Boris 的帖子。它解决了我的一个问题。有什么方法可以避免将 IExtensionConfigProvider 实现与 BindingAttribute 放在同一个程序集中?这样我就可以在不同的其他 Azure Function 项目中重用 BindingAttribute。我只有一个 IExtensionConfigProvider,所以 'extensions.json' 在我的情况下不起作用。
  • 请注意,如果您像我们一样使用 WebJobs 运行时的 V3,那么上述方法将不起作用,您需要遵循该问题的公认答案:stackoverflow.com/questions/52123538/…
  • 如果您使用基于 NodeJs 的 (javascript) Azure 函数,您将如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2016-09-12
  • 2012-08-14
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多