使用WebJob

时间:2017-03-17 12:47:36

标签: visual-studio-2015 asp.net-core azure-web-sites azure-webjobs visual-studio-2017

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

我正在使用Visual Studio 2017,但VS2015的结果似乎相同。

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

enter image description here

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

enter image description here

此时我有点失落。在旧的Asp.Net MVC 5方法中,我曾经能够点击Asp.Net项目并找到“Add => New Azure Webjobs Project”。然后,WebJob将始终在发布中链接,只是“工作”。

使用新的Asp.Net Core方法,我似乎无法找到一种类似的简单方法来实现这一目标。

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

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

4 个答案:

答案 0 :(得分:8)

有一种方法可以做到这一点,它适用于VS 2015和project.json(甚至允许你从VSTS构建和部署到Azure而不做任何修改),并且有点适用于VS 2017 - 从VS工作发布正如预期的那样,但我没有设法使其在VSTS上运行而不添加一些额外的构建步骤。

VS 2015 + project.json

  1. 像往常一样创建Web应用程序项目,无需任何其他与webjob相关的文件。
  2. 为webjob创建.NET Core控制台应用程序。
  3. 在Web应用程序项目中为webjob创建必要的文件夹。对于名为TheJob的连续webjob,它应该是run.cmd
  4. @echo off The.Job.Project.Name.exe 文件添加到上面的文件夹中,内容如下:

    "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\\"
      ]
    }
    
  5. 在web项目的project.json文件中,添加以下脚本:

    <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>
    
  6. 诀窍在第二个脚本中 - 它将webjob项目直接发布到Web应用程序的App_Data目录中,因此它随网站发布。

    VS 2017 + .csproj

    将项目转换为VS 2017格式后,脚本将被转换,但遗憾的是,无法正常工作,webjob文件尚未发布。

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

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

    <?php
    // Load Some Content
    echo '<div class="click" onclick="getData()">Click Here</div>';
    // Don't Load The Following Div Unless User Clicks The Above Div
    echo '<div class="load" id="loadFromApi">';
    echo '</div>';
    echo '<script src="https://code.jquery.com/jquery-3.2.0.min.js" integrity="sha256-JAW99MJVpJBGcbzEuXk4Az05s/XyDdBomFqNlM3ic+I=" crossorigin="anonymous"></script>';
    echo '<script>';
    echo 'function getData(){';
    echo '$("#loadFromApi").load("api.php");';
    echo '}';
    echo '</script>';
    // Load Some Content
    ?>
    

    希望有所帮助:)

答案 1 :(得分:6)

我设法让它在所有情况下都可以使用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)。

希望有所帮助!

答案 2 :(得分:4)

添加到Tomas&#39;回答,如果您想使用git deploy进行设置,则需要修改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.here.

希望这有帮助。

Sample Working Webjob

答案 3 :(得分:1)

您可以将此行用于VSTS版本VS2017 csproj

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