使用 WebJob 发布简单 Asp.Net 核心应用程序 (.Net Framework)

Publish simple Asp.Net Core App (.Net Framework) with WebJob

我想创建一个简单的 ASP.NET 核心 Web 应用程序 (.NET Framework) 并将 WebJob 与其一起发布到 Azure。

我用的是Visual Studio2017,结果在VS2015里好像是一样的。

首先,我在 VS2017 中创建相应的项目:

我select基本的网络应用程序模板:

此时我有点迷茫了。在较旧的 Asp.Net MVC 5 方法中,我曾经能够单击 Asp.Net 项目并找到 "Add => New Azure Webjobs Project"。然后 WebJob 将始终在发布中链接,并且只是 "work".

使用新的 Asp.Net 核心方法,我似乎找不到类似的简单方法来实现这一点。

我尝试手动将 WebJobs 项目添加到解决方案,然后在 Asp.Net 项目中手动设置 webjobs-list.json 文件,但发布步骤无法识别它。我注意到 this one 之类的各种答案建议挂接到发布过程以复制文件,但添加到 *.pubxml 文件的标记没有任何影响(即文件未被复制)。

似乎有一些关于此任务的过时信息。也许有人能够详细说明在 Visual Studio 中包含 Asp.Net 核心应用程序的新解决方案的当前执行过程?

有一种方法可以做到,它适用于 VS 2015 和 project.json(甚至允许您从 VSTS 构建和部署到 Azure,无需任何修改),并且可以在 VS 2017 中使用 -从 VS 发布按预期工作,但我没能在不添加一些额外的构建步骤的情况下使其在 VSTS 上工作。

VS 2015 + project.json

  1. 像往常一样创建网络应用项目,没有任何额外的网络作业相关文件。
  2. 为 webjob 创建 .NET Core 控制台应用程序。
  3. 在网络应用项目中为网络作业创建必要的文件夹。对于名为 TheJob 的连续网络作业,它应该是 App_Data/Jobs/Continuous/TheJob.
  4. run.cmd 文件添加到上面的文件夹,内容如下:

    @echo off
    The.Job.Project.Name.exe
    
  5. 在 web 项目的 project.json 文件中,添加以下脚本:

    "scripts": {
      "postpublish": [
        "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%",
        "dotnet publish ..\Web.Job.Project.Name\ -o %publish:OutputPath%\app_data\jobs\continuous\TheJob\"
      ]
    }
    

诀窍在于第二个脚本 - 它将 webjob 项目直接发布到网络应用程序的 App_Data 目录中,因此它会与网站一起发布。

VS 2017 + .csproj

将项目转换为 VS 2017 格式后,脚本正在转换,但遗憾的是不起作用,webjob 文件未发布。

我发现使其部分工作的一种方法是将 webjob 发布到 Web 应用程序的临时发布目录,因此它稍后会被拾取并从 VS 发布,但不幸的是它仅在直接从 Visual Studio 发布时有效. 它不适用于 VSTS 构建。

为此,请将以下部分添加到 Web 应用程序的项目文件中:

<Target Name="PostpublishScript" AfterTargets="Publish">
  <Exec Command="dotnet publish ..\Web.Job.Project.Name\ -o $(ProjectDir)obj$(Configuration)$(TargetFramework)$(RuntimeIdentifier)\PubTmp\Out\App_Data\Jobs\Continuous\TheJob" />
</Target>

希望对您有所帮助:)

添加到 Tomas 的答案中,如果您想使用 git 部署进行设置,则需要修改 Azure WebApp 中的 deploy.cmd 文件。

有一个工作示例here.

为了使其正常工作,请确保将 run.cmd 文件添加到您的 WebJob 项目:

@echo off
dotnet SampleWebJob.dll (you can change this to run an .exe if you want to)

您还需要修改您的 .csproj 并包含

<Target Name="PostpublishScript" AfterTargets="Publish">
    <Exec Command="dotnet publish ..\SampleWebJob\ -o $(ProjectDir)obj$(Configuration)$(TargetFramework)$(RuntimeIdentifier)\PubTmp\Out\App_Data\Jobs\Continuous\SampleWebJob" />
</Target>

此外,如果您想使用 git 部署自动执行此操作,您需要修改 site/deployments/tools 下的 deploy.cmd 并包含此行。

:: 2.1 Build and publish WebJobs
echo Building and deploying Radius365.WebJob
call :ExecuteCmd dotnet publish "SampleWebJob\SampleWebJob.csproj" -o "%DEPLOYMENT_TEMP%\App_Data\Jobs\Continuous\SampleWebJob" -c Release

您可以获得更多信息here. and here.

希望对您有所帮助。

您可以将此行用于 VSTS 构建 VS2017 csproj

<Target Name="PostpublishScript" AfterTargets="Publish">
    <Exec Command="dotnet publish ..\SampleWebJob\ -o $(PublishDir)App_Data\Jobs\Continuous\SampleWebJob" />
  </Target>

我设法在所有情况下使用 VSTS 或在本地使用这些行发布 VS 2017 csproj:

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
  <PropertyGroup>
    <!-- Ensure any PublishDir has a trailing slash, so it can be concatenated -->
    <PublishDir Condition="!HasTrailingSlash('$(PublishDir)')">$(PublishDir)\</PublishDir>
  </PropertyGroup>

  <PropertyGroup>
    <PublishDirFullPath>$([System.IO.Path]::GetFullPath('$(PublishDir)'))</PublishDirFullPath>
  </PropertyGroup>
</Target>

<Target Name="PostpublishScript" AfterTargets="Publish">
  <Exec Command="dotnet publish ..\SampleWebJob\ -r $(RuntimeIdentifier) -f $(TargetFramework) -c $(Configuration) -o $(PublishDirFullPath)App_Data\jobs\continuous\SampleWebJob\" />
</Target>

它确保:

  • PublishDir 有一个尾部斜杠(使用 dotnet publish -o 选项时可能会丢失)。
  • 我们正在使用完整路径(与以前的版本不同,现在使用 dotnet publish [project] 更改当前目录,因此使用像默认 /bin/[configuration]/[framework]/publish 这样的相对路径,WebJob 将在其自己的 bin 中发布文件夹而不是 Web 项目的文件夹)。
  • 我们使用与 Web 项目相同的发布配置(RuntimeIdentifier、TargetFramework、Configuration)。

希望对您有所帮助!