c# - JobHost 未检测到引用程序集中的 Azure HttpTriggers

标签 c# azure azure-functions azure-http-trigger

当前

我有一个不断增长的功能应用程序库(目前有 14 个),它们创建不同的 3D 模型,但根据设计,每个模型都具有相同的 HttpTriggers,以便中央系统可以调用/触发它们来构建和返回他们的模型。

例如HttpTriggers 例如:

[FunctionName("Register")]
[FunctionName("Awake")]
[FunctionName("Restart")]
[FunctionName("GetAppDetails")]
[FunctionName("Version")]
[FunctionName("GetThumbnail")]
[FunctionName("GetDefaultObject")]
[FunctionName("GetObject")]

等等..

我使用 C#6 In Process 模型在 Azure Function 运行时 v4.x 上运行。 所有 Function 应用都运行良好,并且已经这样做了几年或更长时间。

但是,每个 3D 模型 Function App 都有自己的 VS 解决方案(以便任何人都可以独立开发),并且每个项目都包含相同的 HttpTriggers 样板代码,以便它可以与平台进行互操作。这看起来效率低下,并导致不必要的代码重复。

所需

我想修改他们的 Visual Studio 模板项目,以便将常见 HttpTriggers 的样板源代码隐藏在引用的 dll/nuget 包中,从而使 VS 模板对于新开发人员来说保持美观和简单开发 3D 模型业务逻辑,而无需关心(也可以防止修补)与平台通信的 HttpTrigger 样板代码。

到目前为止,我尚未成功实现此目标,因为当我将 HttpTrigger 源代码移至引用的程序集时,Function Apps JobHost 不再检测到它们。这是当其中任何一个启动时从 JobHost 报告的消息...

Azure Functions Core Tools
Core Tools Version:       4.0.5198 Commit hash: N/A  (64-bit)
Function Runtime Version: 4.21.1.20667

[2023-08-02T16:12:34.160Z] Found C:\Users\ocon5376\source\repos\_DO\_Assets\AccessCover\src\AccessCover.csproj. Using for user secrets file configuration.
[2023-08-02T16:12:40.651Z] No job functions found. Try making your job classes and methods public. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
For detailed output, run func with --verbose flag.
[2023-08-02T16:12:45.220Z] Host lock lease acquired by instance ID '000000000000000000000000C3B350B9'.

这篇文章讨论a similar issue 为了努力遵循其指导并强制及时加载我引用的程序集,我尝试将包含 HttpTriggers 的类设为 StartUp 类,并确认执行已到达 public override void Configure(IFunctionsHostBuilder builder) 方法,其中我添加了 *AppDomain.CurrentDomain.Load(xxx)* - 但是,这并没有导致检测到 HttpTriggers,所以我猜想在 StartUp 时 JobHost 已经进展得太远了类已处理。

到目前为止,我还没有找到任何与此直接类似的帖子。 有谁知道是否可以执行此操作或替代策略来实现我隐藏和避免重复 HttpTrigger 样板代码的目标?

--编辑-- 我还尝试添加带有 [ModuleInitializer] 属性的静态构造函数,如下所示:

[ModuleInitializer]
public static void Init()
{            
    AppDomain.CurrentDomain.Load("Atkins.DynamicObjects.AssetCore"); // manually load into the current domain
}

但是,此策略不成功,因为它不会在程序集加载时调用,而是仅在首次访问时调用。 - 调试确认,直到 JobHost 加载并扫描程序集之后,执行才到达此 block - 所以这是不好的。

我想知道的另一个想法是使用 assemblyload 事件,但除非我弄错了,否则事件处理程序需要添加到 JobHost 的源代码中 - 因此它是我自己代码的上游这对我来说不是一个选择。

最佳答案

有一个FunctionsInDependencies property在用于构建函数的 MSBuild 任务中可用,这应该可以帮助您实现这一目标。

关于c# - JobHost 未检测到引用程序集中的 Azure HttpTriggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76822033/

相关文章:

Azure存储生命周期管理删除追加blob不删除

c# - 如何在VS2010中打开.ccproj?

azure - 是否可以在本地使用 SSL 运行 Azure Function 应用程序?

c# - Blazor Framework 如何在属性值更改时收到通知

c# - 使用 FileHelpers 导入 CSV 文件

c# - Crystal 报表和 ODP.Net

azure - 人们应该如何理解这个错误呢?

c# - 确定目录是否可以在 NTFS 上移动

Azure Pipeline从变量获取模板名称

从 github 操作部署 Azure 函数会导致错误 : connect ECONNREFUSED 127. 0.0.1:443