如何将.NET Core WebJob与ASP.NET Core Web应用一同发布及通过VSTS发布
我来帮你搞定.NET Core WebJob和Web应用一同发布的问题,还有VSTS(Azure DevOps)发布的具体步骤:
一、.NET Core WebJob与Web应用一同发布的正确配置
你提到的Microsoft.Web.WebJobs.Publish NuGet包确实只针对.NET Framework,.NET Core得用另一种方式实现联动发布,不过你一开始创建的webjob-list.json是正确的方向,我们补全配置就行:
确认
webjob-list.json的位置和内容
你的文件路径(webproject/Properties/webjob-list.json)和内容都没问题,这个文件是用来告诉VS哪些WebJob要和Web应用一起发布的:{ "$schema": "http://schemastore.org/schemas/json/webjobs-list.json", "WebJobs": [ { "filePath": "../PeopleWebJob/PeopleWebJob.csproj" }, { "filePath": "../Reminder/ReminderWebJob.csproj" } ] }在Web项目的
.csproj中添加发布联动配置
打开Web应用的.csproj文件,加入以下MSBuild目标配置,这样在发布Web应用时,会自动触发WebJob的发布,并把输出放到Azure WebJob要求的目录下:<!-- 确保webjob-list.json被复制到输出目录 --> <ItemGroup> <None Include="Properties\webjob-list.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> <!-- 发布Web应用后自动发布WebJob到对应目录 --> <Target Name="PublishWebJobs" AfterTargets="Publish"> <!-- 发布第一个触发式WebJob --> <MSBuild Projects="../PeopleWebJob/PeopleWebJob.csproj" Targets="Publish" Properties="PublishDir=$(PublishDir)App_Data/jobs/Triggered/PeopleWebJob/; Configuration=$(Configuration); RuntimeIdentifier=$(RuntimeIdentifier)" /> <!-- 发布第二个触发式WebJob --> <MSBuild Projects="../Reminder/ReminderWebJob.csproj" Targets="Publish" Properties="PublishDir=$(PublishDir)App_Data/jobs/Triggered/Reminder/; Configuration=$(Configuration); RuntimeIdentifier=$(RuntimeIdentifier)" /> </Target>- 注意:如果你的WebJob是持续运行式(而非触发式),要把路径里的
Triggered改成Continuous - 替换
PeopleWebJob和Reminder为你的WebJob实际名称,保持和项目名一致即可
- 注意:如果你的WebJob是持续运行式(而非触发式),要把路径里的
这样配置后,你在VS里发布Web应用时,两个WebJob会被自动打包到App_Data/jobs目录下,一起部署到Azure。
二、通过VSTS(Azure DevOps)发布.NET Core WebJob的步骤
你之前尝试的dotnet publish+复制的思路是对的,我们把它整理成标准的流水线步骤:
构建阶段:分别发布Web应用和WebJob
- 添加两个
.NET Core任务(分别对应两个WebJob):- 命令选择
publish - 项目路径填
**/PeopleWebJob.csproj(另一个填**/ReminderWebJob.csproj) - 发布目录设为
$(Build.ArtifactStagingDirectory)/WebJobs/PeopleWebJob(另一个对应Reminder)
- 命令选择
- 再添加一个
.NET Core任务发布Web应用:- 项目路径填你的Web应用csproj路径
- 发布目录设为
$(Build.ArtifactStagingDirectory)/WebApp
- 添加两个
合并WebJob到Web应用的指定目录
- 添加两个复制文件任务:
- 第一个的源文件夹:
$(Build.ArtifactStagingDirectory)/WebJobs/PeopleWebJob - 目标文件夹:
$(Build.ArtifactStagingDirectory)/WebApp/App_Data/jobs/Triggered/PeopleWebJob - 第二个对应
ReminderWebJob,路径做相应替换
- 第一个的源文件夹:
- 添加两个复制文件任务:
打包并部署到Azure
- 添加一个归档文件任务:
- 源目录选
$(Build.ArtifactStagingDirectory)/WebApp - 归档文件路径设为
$(Build.ArtifactStagingDirectory)/webproject.zip
- 源目录选
- 添加一个Azure Web App部署任务:
- 选择你的Azure订阅和目标Web应用
- 包或文件夹选择刚才生成的
webproject.zip
- 添加一个归档文件任务:
另外补充两个小细节:
- 如果是持续运行的WebJob,要确保WebJob项目的
.csproj里有<OutputType>Exe</OutputType>,并且在Azure Web应用的配置里开启Always On(否则WebJob会被休眠) - 触发式WebJob不需要开启Always On,只要触发条件满足就会运行
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

