複数サイトと仮想アプリケーションの構成
ここでは、複数サイト、仮想アプリケーション、仮想ディレクトリの構築方法を説明します。サンプルファイルのMultiSitesフォルダにソリューションが格納されています。
ソリューションの構成は、図3の通りです。ASP.NET Webロールプロジェクトが1つと、ASP.NET Webアプリケーションプロジェクトが2つ存在します。本サンプルでは、2つのWebアプリケーションプロジェクトを、それぞれ複数サイト、仮想アプリケーションとして構成します。また、Webロールプロジェクトに存在するImageフォルダを仮想ディレクトリとして構成し共用してみます。
ソリューションエクスプローラーからサービス定義ファイル(ServiceDefinition.csdef)を選択して開きます。サービス定義ファイルに、太字部分がサンプルでの追加部分です(リスト3)。
<WebRole name="WebRole1" vmsize="ExtraSmall">
<Sites>
<Site name="Web"> *1
<VirtualApplication name="VirtualApplication" physicalDirectory="../WebApplication2"> *2
<VirtualDirectory name="Image" physicalDirectory="../WebRole1/Image" /> *3
</VirtualApplication>
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
<Site name="WebApplication1" physicalDirectory="../WebApplication1"> *4
<VirtualDirectory name="Image" physicalDirectory="../WebRole1/Image" /> *5
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint2" /> *6
</Bindings>
</Site>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
<InputEndpoint name="Endpoint2" protocol="http" port="8080" /> *7
</Endpoints>
…
</WebRole>
*1はデフォルトのWebサイトです。*2は、デフォルトのWebサイト配下に、WebApplication2プロジェクトを仮想アプリケーションとして構成しています。physicalDirectory属性には、WebApplication2のプロジェクトフォルダを指定しています。
*3と*5は、仮想フォルダを指定しています。physicalDirectoryには、WebRole1プロジェクトのImageフォルダを指定しており、このフォルダが共用されます。
*4は、WebApplication1をもう1つのWebサイトとして構成しています。physicalDirectoryには、WebApplication1プロジェクトのプロジェクトパスを指定しています。複数のサイトを構成する場合、*6のBinding要素が必須です。対応する*7のInputEndpoint要素で、プロトコルと使用するポート番号を指定します。
本サンプルでは、サイトの場所にプロジェクトフォルダを直接指定しています。このように指定すると、不要なソースファイル等もパッケージ化して配置されてしまうので注意してください。実際には、いったんファイルシステムになどに発行を行ない、不要なファイルが含まれないフォルダを指定します。
各サイトに違いが分かるように、Default.aspxには、サイト名、仮想パス、要求されたホスト名を表示します(リスト4)。WebRole1、WebApplication1、WebApplicaton2はすべて同じ内容です。
<%@ Import Namespace="System.Web.Hosting" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<p style="font-size: 150%; font-weight: bold">
サイト名 = <asp:Label ID="Label1" runat="server" Text="<%# HostingEnvironment.SiteName %>" /><br />
仮想パス = <asp:Label ID="Label2" runat="server" Text="<%# HostingEnvironment.ApplicationVirtualPath %>" /><br />
要求されたホスト名 = <asp:Label ID="Label3" runat="server" Text="<%# this.Request.Url.Host %>" />
</p>
<p>
<asp:Image ID="Image1" runat="server" ImageUrl="~/Image/WindowsAzure.png" Width="300" />
</p>
<script runat="server">
protected void Page_Load(object sender, EventArgs e){
this.DataBind();
}
</script>
</asp:Content>
Windows Azureに配置して実行結果を確認してみましょう。各URLにアクセスすると、Sites要素で定義した構成でアクセスできることが確認でき、イメージも共用できていることが確認できます(図4)。
リモートデスクトップ接続し、IISマネージャ確認するとIISのサイトが構成されていることが確認できます(図5)。



