本文介绍如何使用 Visual Studio 将控制台应用项目作为 Azure WebJob 部署到 Azure 应用服务中的 Web 应用。 有关如何使用 Azure 门户部署 WebJobs 的信息,请参阅 在 Azure 应用服务中使用 WebJobs 运行后台任务。
可以选择开发作为 .NET Core 应用 或 .NET Framework 应用运行的 WebJob。 使用 Azure WebJobs SDK 版本 3.x,可以开发作为 .NET Core 应用或 .NET Framework 应用运行的 WebJobs,而版本 2.x 仅支持 .NET Framework。 对于 .NET Core 项目,部署 WebJobs 项目的方式不同于 .NET Framework 项目。
可以将多个 Web 作业发布到单个 Web 应用,前提是 Web 应用中的每个 Web 作业都有唯一的名称。
WebJobs 作为 .NET Core 控制台应用
使用 Azure WebJobs SDK 版本 3.x,可以创建 WebJobs 并将其发布为 .NET Core 控制台应用。 有关创建 .NET Core 控制台应用并将其作为 WebJob 发布到 Azure 的分步说明,请参阅 用于事件驱动的后台处理的 Azure WebJobs SDK 入门。
注释
.NET Core Web 应用和/或 .NET Core WebJobs 不能与 Web 项目链接。 如果需要使用 Web 应用部署 WebJob, 请将 WebJobs 创建为 .NET Framework 控制台应用。
部署到 Azure 应用服务
从 Visual Studio 将 .NET Core WebJob 发布到 Azure 应用服务时,使用与发布 ASP.NET Core 应用相同的工具。
在“解决方案资源管理器” 中,右键单击该项目并选择“发布”。
在“发布”对话框中,对于“目标”,请选择“Azure”,然后选择“下一步” 。
对于“特定目标”,请选择“Azure WebJobs”,然后选择“下一步” 。
在“应用服务实例”上方,选择“加号”() 按钮以创建新的 Azure WebJob。
在“应用服务(Windows)”对话框中,使用下表中的主机设置。
设置 建议值 DESCRIPTION 名称 全局唯一名称 用于唯一标识您新建函数应用的名称。 订阅 选择订阅 要使用的 Azure 订阅为: 资源组 我的资源组 要在其中创建函数应用的资源组的名称。 选择 “新建 ”以创建新资源组。 托管计划 应用服务计划 应用服务计划指定托管应用的 Web 服务器场的位置、大小和功能。 可以在托管多个应用时节省资金,方法是将多个 Web 应用配置为共用单个应用服务计划。 应用服务计划定义区域、实例大小、规模计数和 SKU(免费、共享、基本、标准或高级)。 然后,选择“新建”以创建一个新的应用服务计划。 免费层和基本层不支持“始终启用”选项以保持站点的持续运行。 选择“创建”以使用这些设置在 Azure 中创建 WebJob 和相关资源,并部署项目代码。
选择“完成”以回到“发布”页。
WebJobs 作为 .NET Framework 控制台应用
如果使用 Visual Studio 部署启用了 WebJobs 的 .NET Framework 控制台应用项目,它会将运行时文件复制到 Web 应用中的相应文件夹(连续 WebJobs 为 App_Data/jobs/continuous,计划或按需 WebJobs 为 App_Data/jobs/triggered)。
Visual Studio 将以下项添加到启用了 WebJobs 的项目:
- Microsoft.Web.WebJobs.Publish NuGet 包。
- 文件webjob-publish-settings.json包含部署和计划程序设置。
可以将这些项目添加到现有的控制台应用项目,或使用模板创建新的启用了 WebJobs 的控制台应用项目。
自行将项目部署为 WebJob,或将其链接到 Web 项目,以便在部署 Web 项目时自动部署。 若要链接项目,Visual Studio 在 Web 项目中的 webjobs-list.json 文件中包括启用了 WebJobs 的项目的名称。
先决条件
使用 Azure 开发工作负载安装 Visual Studio 2022。
为现有的控制台应用程序项目启用 WebJobs 部署
可以使用两个选项:
-
配置现有的控制台应用项目,以便在部署 Web 项目时自动将其部署为 Web 作业。 如果要在运行相关 Web 应用程序的同一 Web 应用中运行 WebJob,请使用此选项。
-
将现有的控制台应用项目配置为独立部署为一个 WebJob,不需连接到任何 Web 项目。 如果要单独在 Web 应用中运行 WebJob,且 Web 应用中没有 Web 应用程序运行,请使用此选项。 若要独立于你的 Web 应用程序资源缩放 Web 作业资源,可能需要执行此操作。
使用 Web 项目启用自动 WebJob 部署
右键单击解决方案资源管理器中的 Web 项目,然后选择“将现有项目添加>为 Azure WebJob”。
此时会显示 “添加 Azure WebJob ”对话框。
在 “项目名称 ”下拉列表中,选择要添加为 WebJob 的控制台应用项目。
完成 “添加 Azure WebJob ”对话框,然后选择“ 确定”。
在没有 Web 项目的情况下启用 WebJobs 部署
在 解决方案资源管理器中右键单击控制台应用项目,然后选择“ 发布为 Azure Web 作业”。
此时会显示 “添加 Azure WebJob ”对话框,并在 “项目名称 ”框中选中该项目。
完成 “添加 Azure WebJob ”对话框,然后选择“ 确定”。
此时会显示“发布 Web”向导。 如果不打算立即发布,请关闭向导。 如果要 部署项目,将保存已输入的设置。
创建新的已启用 WebJobs 的项目
若要创建新的启用了 WebJobs 的项目,请使用控制台应用项目模板并启用 WebJobs 部署,如 上一部分所述。 或者,可以使用 WebJobs new-project 模板:
-
创建一个项目,并将其配置为可以自行部署为 WebJob,而无需与任何 Web 项目链接。 如果要单独在 Web 应用中运行 WebJob,且 Web 应用中没有 Web 应用程序运行,请使用此选项。 若要独立于你的 Web 应用程序资源缩放 Web 作业资源,可能需要执行此操作。
在链接到 Web 项目的 Web 作业中使用 Web 作业新建项目模板
在同一解决方案中创建一个项目,该项目配置为在部署 Web 项目时自动作为 Web 作业进行部署。 如果要在运行相关 Web 应用程序的同一 Web 应用中运行 WebJob,请使用此选项。
注释
WebJobs 新项目模板会自动安装 NuGet 包,并在 WebJobs SDK的 Program.cs中包含代码。 如果不想使用 WebJobs SDK,请删除或更改host.RunAndBlock
Program.cs中的语句。
对独立的 WebJob 使用 WebJob 新建项目模板
选择“文件”>“新建”>“项目”。 在“创建新项目”对话框中,搜索并选择 C# 的 Azure WebJob (.NET Framework)。
按照前面的说明 作,使控制台应用项目成为独立的 WebJobs 项目。
对链接到 Web 项目的 WebJob 使用 WebJob 新建项目模板
右键单击 解决方案资源管理器中的 Web 项目,然后选择“ 添加新>的 Azure WebJob 项目”。
此时会显示 “添加 Azure WebJob ”对话框。
完成 “添加 Azure WebJob ”对话框,然后选择“ 确定”。
webjob-publish-settings.json 文件
为 WebJobs 部署配置控制台应用时,Visual Studio 将安装 Microsoft.Web.WebJobs.Publish NuGet 包,并将计划信息存储在 WebJobs 项目的项目“属性”文件夹中的webjob-publish-settings.json 文件中。 下面是该文件的示例:
{
"$schema": "http://schemastore.org/schemas/json/webjob-publish-settings.json",
"webJobName": "WebJob1",
"startTime": "null",
"endTime": "null",
"jobRecurrenceFrequency": "null",
"interval": null,
"runMode": "Continuous"
}
可以直接编辑此文件,Visual Studio 提供 IntelliSense。 文件架构存储在 https://schemastore.org 其中,并可在其中查看。
webjobs-list.json 文件
将启用了 WebJobs 的项目链接到 Web 项目时,Visual Studio 会将 WebJobs 项目的名称存储在 Web 项目的“属性”文件夹中的webjobs-list.json 文件中。 该列表可能包含多个 WebJobs 项目,如以下示例所示:
{
"$schema": "http://schemastore.org/schemas/json/webjobs-list.json",
"WebJobs": [
{
"filePath": "../ConsoleApplication1/ConsoleApplication1.csproj"
},
{
"filePath": "../WebJob1/WebJob1.csproj"
}
]
}
可以使用 IntelliSense 直接在 Visual Studio 中编辑此文件。 文件架构存储在 https://schemastore.org.
部署 WebJobs 项目
与 Web 项目关联的 WebJobs 项目将随其自动部署。 有关 Web 项目部署的信息,请参阅操作指南,在>左侧导航中部署应用程序。
若要自行部署 WebJobs 项目,请在 解决方案资源管理器 中右键单击该项目,然后选择“ 发布为 Azure WebJob”。
对于独立的 Web 作业,会显示 Web 项目使用的相同“发布 Web”向导,但其中的可更改设置更少。
“添加 Azure WebJob”对话框
“ 添加 Azure WebJob ”对话框允许输入 WebJob 名称和 WebJob 的运行模式设置。
此对话框中的某些字段对应于 Azure 门户的 “添加 WebJob ”对话框中的字段。 有关详细信息,请参阅 在 Azure 应用服务中使用 WebJobs 运行后台任务。
WebJob 部署信息:
有关命令行部署的信息,请参阅 启用 Azure WebJobs 的命令行或持续交付。
如果部署 WebJob,然后决定要更改 WebJob 的类型并重新部署,请删除 webjobs-publish-settings.json 文件。 这样做会导致 Visual Studio 重新显示发布选项,以便可以更改 WebJob 的类型。
如果部署 WebJob,稍后将运行模式从连续更改为非连续模式,或者反之亦然,Visual Studio 会在重新部署时在 Azure 中创建新的 WebJob。 如果更改其他计划设置,但保持运行模式相同,或在“计划”和“按需”之间切换,Visual Studio 会更新现有作业,而不是创建新的作业。
Web 作业类型
WebJob 的类型可以是 触发型 或 连续型:
触发(默认):触发的 WebJob 可以在绑定事件发生时、按照计划或通过手动触发(按需)启动。 它在 Web 应用运行的单个实例上运行。
连续:创建 WebJob 后,将立即启动连续式 WebJob。 它默认在所有 Web 应用缩放实例上运行,但可以配置为通过 settings.job 作为单个实例运行。
注释
Web 应用可在进入非活动状态 20 分钟后超时,只有向实际 Web 应用发出请求才会重置计时器。 在 Azure 门户中查看应用的配置或向高级工具站点发出请求不会重置计时器。 如果将托管作业的 Web 应用设置为持续运行、按计划运行或使用事件驱动的触发器,请在 Web 应用的 Azure“配置”窗格中启用“始终可用”设置。 “Always on”设置有助于确保这些类型的 WebJobs 可靠运行。 此功能仅在基本、标准和高级价格层级中提供。
计划触发的 WebJob
将控制台应用发布到 Azure 时,Visual Studio 会默认将 WebJob 的类型设置为 “触发” ,并将新的 settings.job 文件添加到项目中。 对于触发的 WebJob 类型,可以使用此文件为 WebJob 设置执行计划。
使用 settings.job 文件为 WebJob 设置执行计划。 以下示例每小时运行一次,从上午 9 点到下午 5 点:
{
"schedule": "0 0 9-17 * * *"
}
此文件位于包含 WebJob 脚本的 WebJobs 文件夹的根目录,例如 wwwroot\app_data\jobs\triggered\{job name}
或 wwwroot\app_data\jobs\continuous\{job name}
。 当从 Visual Studio 部署 WebJob 时,请将 Visual Studio 中的 settings.job 文件属性标记为 “如果较新则复制”。
如果 从 Azure 门户创建 WebJob,则会为你创建 settings.job 文件。
CRON 表达式
WebJobs 使用与 Azure Functions 中的计时器触发器相同的 CRON 表达式进行计划。 若要了解有关 CRON 支持的详细信息,请参阅 Azure Functions 的计时器触发器。
注释
运行 CRON 表达式使用的默认时区为协调世界时 (UTC)。 若要让 CRON 表达式基于其他时区运行,请为函数应用创建一个名为 WEBSITE_TIME_ZONE 的应用设置。 若要了解详细信息,请参阅 NCRONTAB 时区。
settings.job reference
WebJobs 支持以下设置:
设置 | 类型 | 说明 |
---|---|---|
is_in_place |
全部 | 允许 WebJob 就地运行,而无需先复制到临时文件夹。 有关详细信息,请参阅 WebJob 工作目录。 |
is_singleton |
连续的 | 仅在横向扩展时在单个实例上运行 Web 作业。有关详细信息,请参阅将连续式作业设为单一实例。 |
schedule |
触发 | 按基于 CRON 的计划运行 WebJob。 有关详细信息,请参阅 NCRONTAB 表达式。 |
stopping_wait_time |
全部 | 允许控制关闭行为。 有关详细信息,请参阅正常关闭。 |
连续执行
如果在 Azure 中启用 Always on ,可以使用 Visual Studio 更改 WebJob 以持续运行:
如果尚未这样做, 请将项目发布到 Azure。
在“解决方案资源管理器” 中,右键单击该项目并选择“发布”。
在 “设置” 部分中,选择“ 显示所有设置”。
在“配置文件设置”对话框中,为 Web 作业类型选择“连续”,然后选择“保存”。
在“ 发布 ”选项卡中选择“ 发布 ”,使用更新的设置重新发布 Web 作业。