本文介绍了如何使用 Visual Studio 将控制台应用项目作为 Azure WebJob 部署到 Azure 应用服务 中的 Web 应用。 有关如何通过Azure 门户部署 WebJobs 的信息,请参阅在 Azure 应用服务 中使用 WebJobs 运行后台任务。
可以选择开发作为 .NET Core 应用或 .NET Framework 应用 运行的 WebJob。
可以将多个 Web 作业发布到单个 Web 应用,前提是 Web 应用中的每个 Web 作业都有唯一的名称。
作为 .NET Core 控制台应用的 WebJobs
使用 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 应用服务
将 .NET Core WebJob 从 Visual Studio 发布到 Azure 应用服务 使用与发布 ASP.NET Core 应用相同的工具。
在 解决方案资源管理器 中,右键单击项目并选择 Publish。
在“
Publish 对话框中,为Target2 选择 Azure ,然后选择Next 。对于特定目标,选择Azure WebJobs,然后选择下一步。
在 App 服务实例上方选择加号(+)按钮以创建新的 Azure WebJob。
在 App Service (Windows) 对话框中,使用下表中的托管设置。
设置 建议值 Description 名称 全局唯一名称 用于唯一标识新 Function App 的名称。 Subscription 选择订阅 要使用的 Azure 订阅。 资源组 myResourceGroup 要在其中创建函数应用的资源组的名称。 选择 “新建 ”以创建新资源组。 托管计划 App Service 计划 应用服务计划指定托管应用的 Web 服务器场的位置、大小和功能。 可以在托管多个应用时节省资金,方法是将多个 Web 应用配置为共用单个应用服务计划。 应用服务计划定义区域、实例大小、规模计数和 SKU(免费、共享、基本、标准或高级)。 然后,选择“新建”以创建一个新的应用服务计划。 免费层和基本层不支持“始终启用”选项以保持站点的持续运行。
选择 Create,使用这些设置在Azure中创建 WebJob 和相关资源并部署项目代码。
选择“完成”以回到“发布”页。
作为 .NET Framework 控制台应用的 WebJobs
如果使用Visual Studio部署启用了 WebJobs 的 .NET Framework 控制台应用项目,则会将运行时文件复制到 Web 应用中的相应文件夹(App_Data/jobs/continuous 用于连续 WebJobs,而 App_Data/jobs/triggered 用于计划或按需运行的 WebJobs)。
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 项目启用自动 WebJobs 部署功能
在 解决方案资源管理器 中右键单击 Web 项目,然后选择 添加>现有项目作为 Azure WebJob。
将“现有项目”作为 Azure WebJob
此时将显示Add Azure WebJob 对话框。
在 Project name 下拉列表中,选择要添加为 WebJob 的控制台应用程序项目。
完成 Add Azure WebJob 对话框,然后选择 OK。
在没有 Web 项目的情况下启用 WebJobs 部署
右键单击 解决方案资源管理器 中的控制台应用项目,然后选择 Publish 作为 Azure WebJob。
此时将显示“Add Azure WebJob”对话框,在“项目名称”框中选择了项目。
完成 Add Azure WebJob 对话框,然后选择 OK。
此时会显示“发布 Web”向导。 如果不想立即发布,请关闭向导。 如果要 部署项目,将保存已输入的设置。
创建新的已启用 WebJobs 的项目
若要创建新的启用了 WebJobs 的项目,请使用控制台应用项目模板并启用 WebJobs 部署,如 上一部分所述。 或者,可以使用 WebJobs new-project 模板:
-
创建一个项目,并配置它使其可独立部署为 WebJob,无需链接到 Web 项目。 如果要单独在 Web 应用中运行 WebJob,且 Web 应用中没有 Web 应用程序运行,请使用此选项。 你可能希望这样做,以便将 Web 作业资源与 Web 应用程序资源独立进行管理和调配。
将 WebJobs 新建项目模板用于在 Web 项目中集成 Web 作业
在同一解决方案中部署 Web 项目时,创建一个项目,该项目配置为在部署时自动作为 WebJob 部署。 如果要在运行相关 Web 应用程序的同一 Web 应用中运行 WebJob,请使用此选项。
注释
WebJobs 新项目模板会自动安装 NuGet 包,并在 WebJobs SDK的 Program.cs中包含代码。 如果不想使用 WebJobs SDK,请删除或更改host.RunAndBlockProgram.cs中的语句。
使用 WebJobs 新建项目模板来创建独立的 Web 作业
选择 File>New>Project。 在 创建一个新项目对话框中,搜索并选择 C# Azure WebJob (.NET Framework)。
按照前面的说明 作,使控制台应用项目成为独立的 WebJobs 项目。
使用 WebJobs 新项目模板来创建连接到 Web 项目的 Web 作业。
在 解决方案资源管理器 中右键单击 Web project,然后选择 Add>New Azure WebJob Project。
此时将显示Add Azure WebJob 对话框。
完成 Add Azure WebJob 对话框,然后选择 OK。
webjob-publish-settings.json 文件
为 WebJobs 部署配置控制台应用时,Visual Studio安装 Microsoft。Web.WebJobs.Publish NuGet 包并将计划信息存储在 WebJobs 项目的 project Properties 文件夹中的 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 文件中,该文件位于 Web 项目的 Properties 文件夹中。 该列表可能包含多个 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 项目一起自动部署。 有关 Web 项目部署的信息,请在左侧导航中参阅操作指南>,然后部署应用。
若要单独部署 WebJobs 项目,请右键单击 解决方案资源管理器 中的项目,然后选择 Publish 作为 Azure webJob。
对于独立的 WebJob,将出现用于 Web 项目的同一 发布 Web 向导,但可更改的设置较少。
“添加Azure WebJob”对话框
Add Azure WebJob 对话框允许你输入 WebJob 名称和 Web 作业的运行模式设置。
此对话框中的某些字段对应于Add WebJob 对话框中Azure门户的字段。 有关详细信息,请参阅
WebJob 部署信息:
有关命令行部署的信息,请参阅 启用命令行或 Azure WebJobs 的持续交付。
如果部署 WebJob,然后决定要更改 WebJob 的类型并重新部署,请删除 webjobs-publish-settings.json 文件。 这样做会导致Visual Studio重新显示发布选项,以便可以更改 WebJob 的类型。
如果部署 Web 作业,稍后将运行模式从连续更改为非连续模式,则Visual Studio在重新部署时在Azure创建新的 Web 作业。 如果更改其他计划设置,但保持运行模式相同,或在“计划”和“按需”之间切换,Visual Studio更新现有作业,而不是创建新的作业。
Web 作业类型
WebJob 的类型可以是触发或持续:
触发(默认值):触发的 WebJob 基于绑定事件、 按计划或手动触发它时(按需)启动。 它在 Web 应用运行的单个实例上运行。
连续:创建 Web 作业时,将立即启动 连续 Web 作业。 它默认在所有 Web 应用缩放实例上运行,但可以配置为通过 settings.job 作为单个实例运行。
注释
Web 应用可在进入非活动状态 20 分钟后超时,只有向实际 Web 应用发出请求才会重置计时器。 在Azure门户中查看应用的配置或向高级工具站点发出请求不会重置计时器。 如果将托管作业的 Web 应用设置为连续运行、按计划运行或使用事件驱动的触发器,请在 Web 应用的 Azure configuration 窗格中启用 Always on 设置。 Always on 设置有助于确保这些类型的 WebJobs 可靠运行。 此功能仅在基本、标准和高级定价层中提供。
调度触发的 Web 作业
将控制台应用发布到 Azure 时,Visual Studio默认将 WebJob 的类型设置为 Triggered,并将新的 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 部署 Web 作业时,请将 Visual Studio 中的 settings.job 文件属性标记为 如果较新则复制。
如果从 Azure 门户创建 WebJob,则会为你创建 settings.job 文件。
CRON 表达式
WebJobs 使用与Azure Functions中的计时器触发器相同的 CRON 表达式进行计划。 若要了解有关 CRON 支持的详细信息,请参阅 适用于 Azure Functions 的 Timer 触发器。
注释
运行 CRON 表达式使用的默认时区为协调世界时 (UTC)。 若要让 CRON 表达式基于其他时区运行,请为函数应用创建一个名为 WEBSITE_TIME_ZONE 的应用设置。 若要了解详细信息,请参阅 NCRONTAB 时区。
settings.job 参考
WebJobs 支持以下设置:
| 设置 | 类型 | 说明 |
|---|---|---|
is_in_place |
全部 | 允许 WebJob 就地运行,而无需先复制到临时文件夹。 有关详细信息,请参阅 WebJob 工作目录。 |
is_singleton |
连续 | 在进行横向扩展时,只在单个实例上运行 WebJob。有关详细信息,请参阅 将连续作业设置为单一实例。 |
schedule |
触发 | 按基于 CRON 的计划运行 WebJob。 有关详细信息,请参阅 NCRONTAB 表达式。 |
stopping_wait_time |
全部 | 允许对关机行为进行控制。 有关详细信息,请参阅正常关闭。 |
连续执行
如果在 Azure 中启用 Always,则可以使用 Visual Studio更改 WebJob 以连续运行:
如果尚未执行此操作,将项目发布到Azure。
在 解决方案资源管理器 中,右键单击项目并选择 Publish。
在 “设置” 部分中,选择“ 显示所有设置”。
在“配置文件设置”对话框中,为 Web 作业类型选择“连续”,然后选择“保存”。
在“ 发布 ”选项卡中选择“ 发布 ”,使用更新的设置重新发布 Web 作业。