如何构建代码以将2个Web应用程序部署到同一Azure App Service

时间:2016-09-24 22:13:55

标签: azure asp.net-core web-deployment azure-web-app-service

我正在开始一个新项目(让我们称之为MyWebProject)

  1. MyWebProject :使用AspNet Core为Angular2提供SPA的前端应用
  2. MyWebProjectAPI :AspNet Core连接到数据库并暴露RESTful API的后端应用
  3. 由于MyWebProject仅通过http请求访问MyWebProjectAPI,因此它们不具有相互依赖关系。所以我们可以说他们是独立的。

    我有一个域www.mywebproject.com链接到单个Azure应用服务mywebproject.azurewebsites.net,我希望在同一个Azure应用下部署这两个项目(前端和RESTful API)。

    如果我使用网络浏览器访问www.mywebproject.com我想访问前端。我不介意RESTful API的部署位置(我在相同的应用服务IIS下的虚拟目录中猜测?)

    我还计划进行持续部署,将更改推送到Git存储库中的主分支将触发新部署(理想情况下,两个部署都是单独配置的,但我不介意那么多)

    问题是:

    如何构建我的解决方案/项目以及我应该采用哪种方法?

    enter image description here

    我正在考虑一个带有2个主要项目(前端和后端)的单一解决方案以及后端项目所需的库项目,因此我假设它们都必须位于同一个Git存储库中?。那会是个问题吗?或者将它们放在单独的Git存储库和单独的解决方案中更好吗? (这个选项也可以)

    部署到同一个Azure App服务时要遵循的方法是什么?要使用虚拟目录,因为它们都是Web项目(都有wwwroot)?

    另一个选项可能是RESTful API和前端的单个项目,其中一个控制器只为SPA提供服务,其他控制器用作API资源。这肯定会简化一切,但不知怎的,我想让这两个项目独立。

    任何参考,文章或意见将不胜感激。

1 个答案:

答案 0 :(得分:2)

我使用一个应用程序,我们有一个解决方案,即两个不同的Web项目,它们都位于同一个域,并且都是使用持续部署进行部署的。它运作得很好。以下是它的工作原理:

  • 拥有一个Visual Studio解决方案
  • 在该解决方案下有两个网络项目
  • 在App Service的Azure应用程序设置中,滚动到"虚拟应用程序和目录"下面的底部。并为MyWebProjectAPI设置虚拟目录。虚拟目录将是" / MyWebProjectAPI"和物理路径将是" site \ wwwroot \ MyWebProjectAPI"
  • 创建deploy.cmd,以便在解决方案文件夹中执行持续部署,就像正常
  • 一样
  • 编辑deploy.cmd以部署第二个Web项目。

您将在第一个项目中找到一行,如下所示:

call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\MyWebProject\MyWebProject.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\"
IF !ERRORLEVEL! NEQ 0 goto error

复制该代码并更新它以将API项目构建到虚拟目录中(注意第一个路径已更改以及PackageTempDir):

call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\MyWebProjectAPI\MyWebProjectAPI.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%\MyWebProjectAPI";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" 
IF !ERRORLEVEL! NEQ 0 goto error

部署后,您的前端将位于www.mywebproject.com,api将位于www.mywebproject.com/mywebprojectapi(当然您可以重命名所有内容)。

这是正确的方法吗?有利有弊。在我们的例子中,我们需要这样做,因为第二个Web项目来自第三方,不得不住在同一个域。这是一个很大的专业人士 - 您可以避免任何可能的跨域问题。此外,您还需要进行大量整合,只需要担心一个DNS条目(包括SSL证书),并且只需要关注一个App Service。

但是,我可以争辩说,让代码在两个应用程序中运行以获得更加独特的监控和可伸缩性会更好。你说你现在只想要一个App Service,所以无论哪种方式你都没有能力扩展。但是,如果您将两个项目设置为不同的应用程序,如果您需要扩展其中一个而不是另一个,最终可以将它们移动到单独的应用程序服务中。

如果你确实想要两个具有不同DNS条目的独立应用,那么你仍然只能拥有一个解决方案文件。我没有这样做的确切示例,但您可以同时监控该分支。因此,当您推送时,两个应用程序中的构建都会启动。但是,您应该在Azure应用程序设置中添加一个设置,说明应该构建哪个项目,并且您修改deploy.cmd文件以查找此参数以构建正确的项目。