当前位置: 首页 > 知识库问答 >
问题:

在同一azure function应用程序下部署多个功能不起作用

姜志行
2023-03-14

尝试在同一个azure函数应用服务号中部署3个不同类型的函数(CosmosDBTrigger/TimerTrigger/HttpTrigger),附加文件夹结构以供参考。

函数未按预期工作,但在成功部署后引发错误。

函数(CopyToQueue)错误:Microsoft。蔚蓝色的网络作业。主机:索引方法“CopyToQueue”时出错。微软蔚蓝色的网络作业。主机:无法将参数“inputCloudSyncJobModels”绑定到IEnumerable“1”类型。确保绑定支持参数类型。如果您使用的是绑定扩展(例如Azure Storage、ServiceBus、Timers等),请确保在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage()、builder)。AddServiceBus(),生成器。AddTimers()等)。

       public static async Task Run([**TimerTrigger**(scheduleExpression: "%TimerConfig%")]TimerInfo myTimer,
            [CosmosDB(databaseName: "%DatabaseName%",
            collectionName: "%InputCollection%",
            SqlQuery ="%JobsSelectQuery%",
            ConnectionStringSetting = "CosmosDBConnectionString")]
            IEnumerable<object> **inputCloudSyncJobModels**,
            [Queue(queueName: "%JobsQueueName%", Connection = "StorageConnectionString")] IAsyncCollector<string> outputCloudQueueModels,
            Microsoft.Extensions.Logging.ILogger log, ExecutionContext context)

如果我在不同的azure function应用程序服务下部署相同的功能,它们将在不做任何修改的情况下正常工作。

请建议在相同的azure函数应用服务下部署这些函数时将其作为工作函数的方法。

共有2个答案

郭华美
2023-03-14

Azure功能的部署单元是每个应用服务一个功能应用(项目)。你的屏幕截图表明你有三个单独的功能应用程序,你正在部署到一个应用程序服务。我建议您将这三个项目合并为一个项目,这样就可以得到如下结果:

- MyFunctionApp
  - MyTimerTriggerFunction.cs
  - MyQueueTriggerFunction.cs
  - MyCosmosDBTriggerFunction.cs
  - MyGraphApiWebhookFunction.cs
  - Models
  - ...
  - host.json
  - local.settings.json

这也是文件中描述的推荐做法。我建议将子文件夹添加到项目中,以便可以将相关函数和依存类分组在一起。

我还写了一些关于何时将函数组合在一起的指南。

我目前使用的解决方案结构的真实示例。

正如评论中提到的,尽管从技术上讲,将多个Function App项目(GitHub问题)部署到一个Function App Service显然是可能的,但我建议不要这样做,因为:

  1. 它偏离了有文档记录的标准,因此对于新开发人员来说,熟悉解决方案需要额外的努力

由于您关心的是复杂性和维护性的增加,我想说,只要您/您的团队应用干净的编码原则,将(一组内聚的)功能放在一个项目中可以减少复杂性和维护性。

何玺
2023-03-14

我不同意Marc的回答。虽然它可能会偏离文档标准,但从架构的角度来看,在同一个应用服务下包含多个相关功能是非常好的。这在使用服务主要机密和对象ID时非常方便。

解决方案:

将所有三个函数打包在不同的目录中,即CosmosDBTrigger、TimerTrigger、HttpTrigger作为单独的函数,但对所有三个函数使用一个host.json。请注意:您需要在一个文件中包含所有三个函数的主机信息。部署后,您将在单个应用服务下看到多个函数。同样在门户中,单击资源后,您将被重定向到应用服务仪表板,然后在函数选项卡下,您可以单独访问每个函数。

 类似资料:
  • 我创建了一个带有mojs的简单javascript应用程序,一个动画库,并希望将其部署到heroku。首先,我尝试“heroku create”等并将原始应用程序部署到heroku - 该应用程序可以访问,但脚本不起作用。其次,我尝试通过插入脚本引导标记来更改我按照 heroku 网站上的 Node.js 教程制作的应用程序 将我制作的脚本复制到此应用程序的文件夹中 然后运行“npm 安装 moj

  • 可能是Tomcat每次停止都要删除/conf/catalina/localhost文件夹下的website.xml文件。 localhost文件夹下的website.xml文件如下所示

  • 我已经构建了一个Springboot应用程序,其中包括AngLuar5。我有一个gradle构建脚本,它将angular文件加载到我的springboot项目中,这些文件位于springboot项目的resources/static下。当我启动我的应用程序时,angular的路由不再工作,我得到了 错误:无法匹配任何路由。URL段:“访问” 我的项目结构: 如果我打字 www.mysite.com

  • 我想部署两个应用程序foo。war和条形图。war到同一个Tomcat实例。他们是否可以侦听不同端口上的连接,例如,foo侦听端口81,bar侦听端口82?如果是,我如何配置?我意识到应用程序没有必要监听不同的端口,但这正是我想要实现的。 此外,如果我将重命名为,使其在根上下文中运行,那么对该Tomcat实例的所有请求都将由foo应用程序处理,因此bar必须部署到单独的Tomcat实例,这是否正确

  • 我在Openshift上运行node.js应用时遇到了问题。 我已经设置了我的 openshift 项目来从 git 存储库中提取。 我的< code>server.listen调用如下: 拉取和构建工作正常。我可以在pod终端中看到我的应用程序正在运行,因为有一些输出指示这一点。我还可以看到和都不存在,因此端口默认为。 如果我进入pod的终端并执行< code > curl http://loc

  • 我有3个Spring boot应用程序,并希望在单个EC2实例上部署所有应用程序。 当我试图部署war并在tomcat/webapps下部署时,一些应用程序将无法工作,因为spring boot中的嵌入式tomcat使用8080端口,而tomcat中存在的其他web应用程序停止工作。 我尝试过的其他选择是更改服务器。应用程序中的端口。使用java-jar应用程序运行jar的属性文件。罐子 这只适用