使用ServerManager在Application中创建Application

Ric*_*ues 33 c# iis configuration iis-7

我正在使用ServerManager(Microsoft.Web.Administration.dll)在IIS 7上的网站中创建应用程序.我需要在此应用程序中创建应用程序或将虚拟目录转换为应用程序(如iis manager功能权限 - 单击 - >转换为应用程序)这怎么可行?我发现关于这个lib的文档很少,并且没有一个提到这个特定的功能.谢谢.

Kev*_*Kev 99

执行此操作的方法是操作Site.Applications集合,该集合是站点中所有应用程序的展平树.

为了这些示例,我们假设一个名为"MySite"的站点,其中内容位于本地硬盘上:d:\mysite\www.站点的IIS号是3,站点位于自己的应用程序池中,也称为"MySite".

我们还将假设该站点具有以下文件夹结构

替代文字

首先,我们获取要添加应用程序的站点,我们将在site整个过程中使用该变量:

// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);
Run Code Online (Sandbox Code Playgroud)

根"/"应用程序:

每个站点都有一个"根"应用程序.如果我们打开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>
Run Code Online (Sandbox Code Playgroud)

每个都<site>包含一个<application>'s 的集合.总会有至少一个定义根应用程序的应用程序/.

applicationPool属性指定要使用的应用程序池.

请注意,只有一个子元素:virtualDirectory.

每个application都有一个子virtualDirectory元素集合,这个集合中通常至少有一个元素.

<virtualDirectory>根应用程序中的默认值告诉我们:

  • 这是root(path="/")和
  • 它位于d:\MySite\www(physicalPath="d:\MySite\www")的文件系统上.

path每个virtualDirectory是相对于path在父指定application路径.

添加虚拟目录:

如果我们想要将一个虚拟目录添加到映射到文件系统其他位置的"站点根",我们会这样做:

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

结果配置如下:

<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>
Run Code Online (Sandbox Code Playgroud)

我们在IIS管理器中看到了这一点:

替代文字

将虚拟目录添加到现有虚拟目录:

如果我们想要添加子虚拟目录,vdir1我们会这样做:

root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:\MySite\more_content");
Run Code Online (Sandbox Code Playgroud)

这导致:

<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>
Run Code Online (Sandbox Code Playgroud)

IIS管理器:

替代文字

添加虚拟目录时需要记住几件事:

  • 如上所述,虚拟path总是相对于父应用程序path
  • 一个虚拟的最后部分path/vdir_1.../sub_dir1成为虚拟目录的名称
  • 将多个虚拟目录指向同一个物理文件夹是完全合法的
  • 除了虚拟目录路径的名称部分之外,路径的所有部分都应该作为物理路径存在,或者作为网站root(d:\MySite\www)中的虚拟路径存在.即path应该能够覆盖已经存在的东西,否则在IIS管理器中将无法看到虚拟目录.

关于最后一点,例如,我们没有调用物理文件夹或虚拟目录,/vdir_2但以下代码完全合法:

root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");
Run Code Online (Sandbox Code Playgroud)

您将看不到/vdir_2/sub_dir1在IIS管理器中显示但它是合法的,您实际上可以浏览它.我们也可以看到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>
Run Code Online (Sandbox Code Playgroud)

将文件夹转换为应用:

如果您刚刚将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();    
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

在IIS中我们看到:

替代文字

这相当于右键单击"转换为应用程序".

添加应用到现有应用:

将应用程序添加为现有应用程序的子项非常简单.假设我们想要进行/app_1/sub_app_1以下子应用/app_1:

替代文字

我们会这样做:

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

结果配置如下:

<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>
Run Code Online (Sandbox Code Playgroud)

在IIS中:

替代文字

添加虚拟目录到应用程序:

现在,如果我们想要为此应用程序添加虚拟目录,我们会这样做:

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

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>
Run Code Online (Sandbox Code Playgroud)

在IIS中我们看到:

替代文字

同样重要的是要注意虚拟路径/vdir1始终相对于包含应用程序的路径.

将现有虚拟目录转换为应用程序

如果我们想将刚刚创建的虚拟目录(/app_1/vdir1)转换为应用程序,该怎么办?我们需要分两步完成:

// 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();    
Run Code Online (Sandbox Code Playgroud)

结果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>
Run Code Online (Sandbox Code Playgroud)

在IIS管理器中,我们看到:

替代文字

添加应用程序到现有虚拟目录:

如果我们想要将应用程序添加到虚拟目录会发生什么,这是如何工作的?在这个例子中,我们将一个应用程序添加到/vdir_1/sub_dir1我们之前创建的虚拟目录中.

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

结果配置如下:

<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>
Run Code Online (Sandbox Code Playgroud)

在IIS管理器中,我们看到:

替代文字

将现有子文件夹转换为应用程序:

作为最后一个例子,我们想要/other_apps/sub_app_1变成一个应用程序:

替代文字

我们的代码如下:

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

结果配置:

<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>
Run Code Online (Sandbox Code Playgroud)

在IIS管理器中:

替代文字

希望这有助于解释站点,应用程序和虚拟目录之间的关系.

  • 很棒的回答Kev.+1 (6认同)
  • 这是我见过的最好,最详细的答案之一; 好工作! (3认同)
  • 像教程一样的答案,凯夫你的力量很强大。 (2认同)
  • 出色的答案——感谢您投入所有的时间和精力。 (2认同)