web-dev-qa-db-ja.com

ServerManagerを使用してアプリケーション内にアプリケーションを作成する

ServerManager(Microsoft.Web.Administration.dll)を使用して、IIS 7.のWebサイト内にアプリケーションを作成します。このアプリケーション内にアプリケーションを作成するか、仮想ディレクトリをアプリケーション(iisマネージャー機能の右クリック->アプリケーションに変換など)これはどのようにして可能ですか?このlibに関するドキュメントはほとんど見つかりませんでしたが、この特定の機能に関するドキュメントはありませんでした。

33

これを行う方法は、サイト内のすべてのアプリケーションのフラット化されたツリーであるSite.Applicationsコレクションを操作することです。

これらの例のために、コンテンツがローカルハードディスクのd:\mysite\wwwにある「MySite」というサイトを想定します。サイトのIIS番号は3であり、サイトは "MySite"とも呼ばれる独自のアプリケーションプールに存在します。

サイトの次のフォルダー構造も想定します

alt text

まず、アプリケーションを追加するサイトを取得するために、変数siteを全体的に使用します。

// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);

ルート "/"アプリケーション:

すべてのサイトには「ルート」アプリケーションがあります。 applicationHost.configにある%systemroot%\windows\system32\inetsrv\configを開き、サイトの<site>ノードを見つけると、次のようになります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\www" />
  </application>
</site>

<site>には<application>のコレクションが含まれています。ルートアプリケーションを定義する少なくとも1つのアプリケーション/が常に存在します。

applicationPool属性は、使用するアプリケーションプールを指定します。

単一の子要素があることに注意してください:virtualDirectory

すべてのapplicationにはvirtualDirectory要素の子コレクションがあり、通常、このコレクションには少なくとも1つの要素があります。

ルートアプリケーション内のデフォルトの<virtualDirectory>は、次のことを示しています。

  • これはルート(path="/")であり、
  • ファイルシステムのd:\MySite\wwwphysicalPath="d:\MySite\www")に物理的に配置されていること。

pathvirtualDirectoryは、親pathパスで指定されたapplicationを基準にしています。

仮想ディレクトリの追加:

ファイルシステムのどこかにマップされた「サイトルート」に仮想ディレクトリを追加したい場合は、次のようにします。

Application rootApp = site.Applications.First(a => a.Path == "/");
rootApp.VirtualDirectories.Add("/vdir_1", @"D:\MySite\other_content");
serverManager.CommitChanges();

結果の構成は次のようになります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
  </application>
</site>

IIS Manager:

alt text

既存の仮想ディレクトリへの仮想ディレクトリの追加:

子仮想ディレクトリをvdir1に追加する場合は、次のようにします。

root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:\MySite\more_content");

この結果は:

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
  </application>
</site>

IISマネージャー:

alt text

仮想ディレクトリを追加するときは、次の2つの点に注意してください。

  • 前述のように、仮想pathは常に親アプリケーションpathに対して相対的です。
  • 仮想pathの最後の部分。 /vdir_1および.../sub_dir1は仮想ディレクトリの名前になります
  • 複数の仮想ディレクトリが同じ物理フォルダを指すようにすることは完全に合法です
  • 仮想ディレクトリパスの名前部分を除いて、パスのすべての部分は、物理パスまたはWebサイトルート内の仮想パスとして存在する必要がありますd:\MySite\www)。つまり、pathはすでに存在するものをオーバーレイできる必要があります。そうしないと、仮想ディレクトリがIISマネージャに表示されません。

その最後の点に関して、たとえば、/vdir_2という物理フォルダーまたは仮想ディレクトリはありませんが、次のコードは完全に合法です。

root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");

IISマネージャに/vdir_2/sub_dir1が表示されることはありませんが、合法であり、実際に閲覧することができます。applicationHost.configにも表示されます。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
</site>

フォルダーをアプリケーションに変換:

ASP.NETアプリケーションをサイトの/app_1フォルダーにアップロードし、これを独自のアプリケーションに変換したい場合は、次のようにします。

Application app = site.Applications.Add("/app_1", @"d:\MySite\www\app_1");
// set application pool, otherwise it'll run in DefaultAppPool
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();    

applicationHost.configでは、新しい<application>要素が追加されていることがわかります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
  </application>
</site>

IISでは、

alt text

これは、「アプリケーションに変換」を右クリックするのと同じです。

既存のアプリケーションにアプリケーションを追加:

アプリケーションを既存のアプリケーションの子として追加するのは非常に簡単です。 /app_1/sub_app_1/app_1のサブアプリケーションにしたいとします。

alt text

私たちは単にそうするでしょう:

Application app = 
  site.Applications.Add("/app_1/sub_app_1", @"d:\mysite\www\app_1\sub_app_1");
app.ApplicationPoolName ="MySite";

結果の構成は次のようになります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
  </application>
  <application path="/app_1/sub_app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\www\app_1\sub_app_1" />
  </application>
</site>

IISの場合:

alt text

アプリケーションに仮想ディレクトリを追加:

このアプリケーションに仮想ディレクトリを追加したい場合は、次のようにします。

Application app = site.Applications.First(a => a.Path == "/app_1");
app.VirtualDirectories.Add("/vdir_1", @"d:\MySite\other_content");

applicationHost.configでは、新しい<virtualDirectory>要素が追加されていることがわかります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
    <virtualDirectory path="/vdir_1" physicalPath="d:\MySite\other_content" />
  </application>
</site>

IISでは、

alt text

ここでも、仮想パス/vdir1は常に、含まれているアプリケーションのパスに相対的であることに注意することが重要です。

既存の仮想ディレクトリをアプリケーションに変換:

作成した仮想ディレクトリ(/app_1/vdir1)をアプリケーションに変換したい場合はどうなるでしょうか。これは2つのステップで行う必要があります。

// Get the application
Application app_1 = site.Applications.First(a => a.Path == "/app_1");
// Find the virtual directory
VirtualDirectory vdir_1 = app_1.VirtualDirectories.First(v => v.Path == "/vdir_1");
// Remove it from app_1
app_1.VirtualDirectories.Remove(vdir_1);
// Create our application
Application vdir_1_app = site.Applications.Add("/app_1/vdir_1", vdir_1.PhysicalPath);
// set application pool, otherwise it'll run in DefaultAppPool
vdir_1_app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();    

結果のapplicationHost.configは次のようになります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
  </application>
  <application path="/app_1/vdir_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
  </application>
</site>

IIS Managerでは、

alt text

既存の仮想ディレクトリにアプリケーションを追加:

アプリケーションを仮想ディレクトリに追加したい場合はどうなりますか?この例では、先に作成した仮想ディレクトリ/vdir_1/sub_dir1にアプリケーションを追加します。

Application app = 
   site.Applications.Add("/vdir_1/sub_dir1/app_2", @"d:\mysite\other_content");
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();

結果の構成は次のようになります。

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
  </application>
  <application path="/app_1/vdir_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
  </application>
  <application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
  </application>
</site>

そしてIIS managerで見る:

alt text

既存の子フォルダをアプリケーションに変換:

最後の例として、/other_apps/sub_app_1をアプリケーションに変換します。

alt text

コードは次のようになります。

Application app = 
   site.Applications.Add("/other_apps/sub_app_1", @"d:\mysite\other_content");
app.ApplicationPoolName="MySite";
serverManager.CommitChanges();

結果の構成:

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="D:\MySite\www" />
    <virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
    <virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
    <virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
  </application>
  <application path="/app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
  </application>
  <application path="/app_1/vdir_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
  </application>
  <application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
  </application>
  <application path="/other_apps/sub_app_1" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
  </application>
</site>

IISマネージャ:

alt text

これがサイト、アプリケーション、仮想ディレクトリの関係の説明に役立つことを願っています。

98
Kev