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

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

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

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

在这里输入图像描述

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

在这里输入图像描述

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

有了新的Asp.Net Core方法,我似乎无法找到一种类似简单的方法来实现这一点。

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

看起来有关此任务的信息有点过时。 可能有人能够详细说明在Visual Studio中为包含Asp.Net Core应用程序的新解决方案执行此操作的当前流程?


有一种方法可以实现,VS 2015和project.json可以很好地工作(甚至可以让你无需修改就可以从VSTS构建和部署到Azure),并且可以在VS 2017中工作 - 从VS发布可按预期工作,但我没有设法使它在VSTS上工作,而无需添加一些额外的构建步骤。

VS 2015 + project.json

  • 像往常一样创建网络应用程序项目,无需任何其他webjob相关文件。
  • 为webjob创建.NET Core控制台应用程序。
  • 在web应用程序项目中为webjob创建必要的文件夹。 对于名为TheJob的连续Webjob,它应该是App_Data/Jobs/Continuous/TheJob
  • run.cmd文件添加到上面的文件夹中,内容如下所示:

    @echo off
    The.Job.Project.Name.exe
    
  • 在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_datajobscontinuousTheJob"
      ]
    }
    
  • 诀窍在于第二个脚本 - 它将webjob项目直接发布到Web应用程序的App_Data目录中,以便随Web站点一起发布。

    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)PubTmpOutApp_DataJobsContinuousTheJob" />
    </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_DatajobscontinuousSampleWebJob" />
    </Target>
    

    它确保:

  • PublishDir有一个结尾斜线(使用dotnet publish -o选项时可能会丢失)。
  • 我们正在使用完整路径(与以前的版本不同,使用dotnet publish [project]现在改变当前目录,所以使用像default /bin/[configuration]/[framework]/publish这样的相对路径,WebJob将在其发布拥有bin文件夹而不是Web项目的文件夹)。
  • 我们使用与Web项目相同的发布配置(RuntimeIdentifier,TargetFramework,Configuration)。
  • 希望有所帮助!


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

    这里有一个工作的例子。

    为了这个工作,请确保你添加一个run.cmd文件到你的WebJob项目中:

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

    您还需要修改.csproj和include

    <Target Name="PostpublishScript" AfterTargets="Publish">
        <Exec Command="dotnet publish ..SampleWebJob -o $(ProjectDir)obj$(Configuration)$(TargetFramework)$(RuntimeIdentifier)PubTmpOutApp_DataJobsContinuousSampleWebJob" />
    </Target>
    

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

    :: 2.1 Build and publish WebJobs
    echo Building and deploying Radius365.WebJob
    call :ExecuteCmd dotnet publish "SampleWebJobSampleWebJob.csproj" -o "%DEPLOYMENT_TEMP%App_DataJobsContinuousSampleWebJob" -c Release
    

    你可以在这里获得更多信息。 和这里。

    希望这可以帮助。

    示例工作Webjob

    链接地址: http://www.djcxy.com/p/21303.html

    上一篇: Publish simple Asp.Net Core App (.Net Framework) with WebJob

    下一篇: Asp.Net Core: Reflecting an Asp.Net Assembly throw exception