关于Visual Studio 2015:使用WebJob发布简单的Asp.Net核心应用程序(.Net Framework)

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

我想创建一个简单的ASP.NET核心Web应用程序(.NET框架),并在它旁边发布一个WebJob到Azure。

我正在使用Visual Studio 2017,但在VS2015中,结果似乎是一样的。

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

enter image description here

我选择基本的Web应用程序模板:

enter image description here

在这一点上,我有点迷路了。在旧的ASP.NET MVC 5方法中,我曾经能够单击ASP.NET项目并找到"添加=>新的Azure WebJobs项目"。然后,网络作业在发布时总是链接在一起,只是"工作"。

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

我尝试手动将WebJobs项目添加到解决方案中,然后在ASP.NET项目中手动设置WebJobs-List.json文件,但发布步骤无法识别它。我注意到了各种各样的答案,比如这一个,它们建议连接到发布过程来复制文件,但是添加到*.pubxml文件中的标记没有任何影响(即文件没有被复制)。

似乎有一些关于这项任务的过时信息。是否有人能够详细说明在Visual Studio中为包含ASP.NET核心应用程序的新解决方案执行此操作的当前过程?


有一种方法可以做到这一点,它可以很好地与vs 2015和project.json配合使用(甚至允许您在不做任何修改的情况下从vsts中构建和部署到azure),并且在vs 2017中也可以实现这一点-按预期从vs works中发布,但我没有设法使它在不添加一些额外构建步骤的情况下在vsts上工作。

与2015年+Project.json相比

  • 像往常一样创建Web应用程序项目,不需要任何其他与Web作业相关的文件。
  • 为webjob创建.NET核心控制台应用程序。
  • 在Web应用程序项目中为Web作业创建必要的文件夹。对于名为job的连续webjob,它应该是App_Data/Jobs/Continuous/TheJob
  • run.cmd文件添加到上面的文件夹中,内容如下:

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

    1
    2
    3
    4
    5
    6
    "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项目直接发布到Web应用程序的app_data目录中,因此它将随网站一起发布。

    与2017年相比

    将项目转换为Vs2017格式后,脚本将被转换,但不幸的是,这些脚本不起作用,webjob文件没有发布。

    我发现让它部分工作的一种方法是将webjob发布到Web应用的临时发布目录,因此稍后会从vs中获取并发布它,但不幸的是,它只能在直接从Visual Studio发布时工作。它不适用于VSTS构建。

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

    1
    2
    3
    <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>

    希望有帮助:)


    我设法让它在所有情况下都能使用VSTS或本地使用这些行发布vs 2017 csproj:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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项目的bin文件夹中发布)。
    • 我们使用的发布配置(runtimeidentifier、targetframework、configuration)与Web项目的发布配置相同。

    希望有帮助!


    要添加到Tomas的答案中,如果要使用git deploy设置此设置,则需要修改Azure webapp中的deploy.cmd文件。

    这里有一个有效的例子。

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

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

    您还需要修改.csproj并包括

    1
    2
    3
    <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并包括这一行。

    1
    2
    3
    :: 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

    你可以在这里得到更多的信息。在这里。

    希望这有帮助。

    Sample Working Webjob


    您可以将此行用于vsts builds vs2017 csproj

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