1

我目前擁有一個具有Web角色的Azure雲服務(因此它是安裝有IIS的虛擬機)。此Web角色當前運行一個獨特的Web應用程序(WebAPI項目)。在同一個Azure WebRole(雲服務)上運行多個應用程序

我想要做的是創建一個新的Web應用程序,但我需要它運行在同一個Web角色(即同一虛擬機上的兩個應用程序)上以降低成本。我知道這是可能的(兩個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中我的項目的「角色」節點顯示錯誤("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> 

回答

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。

+0

謝謝,這使我在正確的軌道(我認爲)。我仍然需要解決一些問題,但這聽起來很有前途 – ken2k

+0

嗯,我成功地將我的兩個應用程序部署在同一個Web角色上。不幸的是,只有其中一個通過互聯網可用(我試圖達到另一個時出現超時)。我已經遠程連接到虛擬機(使用RDP),我可以看到兩個應用程序都正確部署/運行,並且都可以在本地訪問。所以我假設一個應用程序有一些網絡配置問題,在通過Internet訪問時沒有響應。任何想法?謝謝 – ken2k

+0

本地可訪問的角色,但不是遠程的,它必須是端點配置問題。您的原始問題中的Endpoint配置看起來是正確的,但我仍然在回答中添加了一些示例配置行。希望能幫助到你! –

0

如果您可以部署應用程序作爲Azure的Web應用程序,而不是,我會極力推薦它。它旨在很好地處理這種情況。您可以使用您需要的許多服務器實例創建應用服務計劃,然後多個應用程序共享該組服務器。

+0

不幸的是,我不能輕易改變應用程序的構建方式,所以我必須堅持使用雲服務。我確信有一個解決方案,但是(作爲一個web角色是一個簡單的虛擬機與IIS中) – ken2k

相關問題