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

时间:2015-11-19 17:12:58

标签: .net azure asp.net-web-api azure-web-roles azure-cloud-services

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

我尝试做的是创建一个新的Web应用程序,但我需要它在相同的Web角色(即同一个虚拟机上的两个应用程序)上运行以降低成本。我知道它是可能的(两个Web应用程序将在相同的IIS实例上运行,在同一台机器上运行,具有不同的端口)但我无法找到有关如何使用最新版本的Azure SDK。

我找到了很多资源:

但所有人都有点旧(< = 2013),不再申请了。

我目前正在使用Azure SDK 2.6。我已经尝试修改我的ccproj文件(Cloud Service项目文件),因此两个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>

这不起作用,&#34;角色&#34; Visual Studio中我的项目的节点显示错误("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>

1 个答案:

答案 0 :(得分:3)

我认为你在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路径相对于同一位置。例如,我们在解决方案根目录中保留一个“发布”目录,因此对我们来说,PublishDestination看起来像

..\Publish\MyProject2\ 

,physicalDirectory看起来像

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

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

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

...使用与每个站点的endpointName相对应的“名称”:

    <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上本地运行,则会将localPort="8081"添加到该InputEndpoint。