运行 同一 Azure WebRole(云服务)上的多个应用程序

Running multiple applications on the same Azure WebRole (Cloud Services)

我目前有一个带有 Web 角色的 Azure 云服务(所以它是一个安装了 IIS 的虚拟机)。此 Web 角色当前 运行 是一个独特的 Web 应用程序(WebAPI 项目)。

我想做的是创建一个新的网络应用程序,但我需要它 运行 在同一个网络角色(即同一虚拟机上的两个应用程序)上以降低成本。我知道这是可能的(然后两个 Web 应用程序将 运行 在同一个 IIS 实例上,在同一台机器上,使用不同的端口)但是我找不到关于如何使用最新版本的 Azure SDK 执行此操作的资源.

我找到了很棒的资源:

但都有些旧了 (<= 2013),不再适用了。

我目前使用的是 Azure SDK 2.6。我尝试修改我的 ccproj 文件(云服务项目文件),以便两个 WebAPI 项目共享相同的 RoleName:

<ProjectReference Include="..\MyProject1.csproj">
  <Name>Website</Name>
  <Project>{...}</Project>
  <Private>True</Private>
  <RoleType>Web</RoleType>
  <RoleName>MyRole</RoleName>
</ProjectReference>
<ProjectReference Include="..\MyProject2.csproj">
  <Name>Website</Name>
  <Project>{...}</Project>
  <Private>True</Private>
  <RoleType>Web</RoleType>
  <RoleName>MyRole</RoleName>
</ProjectReference>

这不起作用,我在 Visual Studio 中的项目的 "roles" 节点显示错误 ("no project associated [project 2 name])。

我也尝试修改我的 ServiceDefinition.csdef 文件:

<WebRole name="xxxx.Frontend.Azure" vmsize="Small">
    <Sites>
        <Site name="Web">
            <Bindings>
                <Binding name="Endpoint1" endpointName="Endpoint1" />
            </Bindings>
        </Site>
        <Site name="AnotherWeb" physicalDirectory="foo">
            <Bindings>
                <Binding name="Endpoint2" endpointName="Endpoint2" />
            </Bindings>
        </Site>
    </Sites>
    <Endpoints>
        <InputEndpoint name="Endpoint1" protocol="http" port="8080" />
        <InputEndpoint name="Endpoint2" protocol="http" port="8090" />
    </Endpoints>
</WebRole>

也不走运。

我应该如何进行?


编辑:

这是我当前的 csdef 文件,修改后支持多个站点:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
  <WebRole name="XXX.YYY" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="RemoteAccess" />
    </Imports>
  </WebRole>
  <WebRole name="XXX.ZZZ" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
      <Site name="ZZZ" physicalDirectory="..\..\..\XXX.ZZZ\azure.publish">
        <Bindings>
          <Binding name="Endpoint2" endpointName="Endpoint2" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="8081" />
      <InputEndpoint name="Endpoint2" protocol="http" port="8090" />
    </Endpoints>
    <Imports>
      <Import moduleName="RemoteAccess" />
    </Imports>
  </WebRole>
</ServiceDefinition>

如果您可以将应用程序部署为 Azure Web 应用程序,我强烈推荐它。它旨在很好地处理这种情况。您可以使用所需的任意数量的服务器实例创建应用服务计划,然后多个应用共享该组服务器。

我认为您对 csdef 文件的更改是正确的,而对 ccproj 的更改是错误的。因此,摆脱您的第二个 ProjectReference,因为您最终只需要一个 WebRole。

应该 在 ccproj 文件中添加这样一行:

<MSBuild Projects="..\MyProject2\MyProject2.csproj" ContinueOnError="false" Targets="PublishToFileSystem" Properties="Configuration=$(Configuration);PublishDestination=..\Publish\MyProject2\;AutoParameterizationWebConfigConnectionStrings=False" />

显然有假路径,但重要的是确保 csproj 文件的路径有效,并确保 PublishDestination 路径与您在 csdef 文件中为该站点指定的 PhysicalDirectory 路径相匹配,并注意 PhysicalDirectory 路径和 PublishDestination 路径相对于同一位置 not。例如,我们在解决方案根目录中保留一个 "Publish" 目录,因此对我们来说 PublishDestination 看起来像

..\Publish\MyProject2\ 

物理目录看起来像

..\..\..\Publish\MyProject2

您的端点配置看起来正确,但如果无法远程访问某个角色,请确保您的 csdef 文件在 Endpoints 中有一行:

    <Endpoints>
        <InputEndpoint name="MyProject1Endpoint" protocol="http" port="80" />
        <InputEndpoint name="MyProject2Endpoint" protocol="http" port="8080" />
    </Endpoints>

...具有对应于每个站点的端点名称的 "name":

    <Sites>
        <Site name="MyProject1Site" physicalDirectory="..\..\..\MyProject1">
            <Bindings>
                <Binding name="MyProject1Binding" endpointName="MyProject1Endpoint" />
            </Bindings>
        </Site>
        <Site name="MyProject2Site" physicalDirectory="..\..\..\Publish\MyProject2">
            <Bindings>
                <Binding name="MyProject2Binding" endpointName="MyProject2Endpoint" />
            </Bindings>
        </Site>
    </Sites>

假设您希望每个网站都可以在其托管的同一端口上公开访问。如果出于某种原因,MyProject2 在本地端口 8081 上 运行,您将向该 InputEndpoint 添加 localPort="8081"