c# - 使用 ServerManager 在应用程序中创建应用程序

标签 c# iis configuration iis-7

我正在使用 ServerManager (Microsoft.Web.Administration.dll) 在 IIS 7 上的网站内创建一个应用程序。
我需要在这个应用程序中创建一个应用程序或将一个虚拟目录转换为一个应用程序(如iis管理器功能右键单击->转换为应用程序)
这如何可行?我发现关于这个库的文档很少,而且没有一个提到这个特定的功能。
谢谢。

最佳答案

这样做的方法是操纵Site.Applications集合,它是站点中所有应用程序的扁平树。

为了这些示例,我们假设一个名为“MySite”的站点,其中的内容位于本地硬盘上:d:\mysite\www .该站点的 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> 的集合的。总会有至少一个应用程序定义根应用程序,/ .
applicationPool属性指定要使用的应用程序池。

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

application有一个子集合 virtualDirectory元素,并且该集合中通常至少有一个元素。

默认<virtualDirectory>在根应用程序中告诉我们:
  • 这是根( 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();
    

    结果配置如下:
    <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 管理器中看到了这一点:

    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

    添加虚拟目录时需要记住以下几点:
  • 如前所述,虚拟path始终相对于父应用程序 path
  • 虚拟的最后一部分path例如/vdir_1.../sub_dir1成为虚拟目录的名称
  • 让多个虚拟目录指向同一个物理文件夹是完全合法的
  • 除了虚拟目录路径的名称部分外,路径的所有部分都应该作为物理路径或网站根目录中的虚拟路径存在 ( d:\MySite\www )。即 path应该能够覆盖已经存在的内容,否则虚拟目录在 IIS 管理器中将不可见。

  • 例如,关于最后一点,我们没有名为 /vdir_2 的物理文件夹或虚拟目录。但以下代码是完全合法的:
    root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");
    

    你不会看到 /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>
    

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

    如果您刚刚将 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 )转换为应用程序怎么办?我们需要分两步完成:
    // 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 管理器中,我们看到:

    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 管理器中,我们看到:

    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

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

    关于c# - 使用 ServerManager 在应用程序中创建应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4518186/

    相关文章:

    c# - 使用 System.Net.Mail.MaiMessage 使用 C# 发送时如何防止 HTML 电子邮件引用可打印

    c# - C#中数组的stackalloc

    .net - Windows 7 Websocket PlatformNotSupportedException

    configuration - Nginx 403 错误 : directory index of [folder] is forbidden

    java - 如何获取当前的屏幕方向?

    c# - 如何将 SQL Server 过程变量设置为从 C# ASP.NET MVC 程序输入的数据?

    c# - 如何检测文本文件的编码/代码页?

    .net - Windows 客户端损坏授权 header (Kerberos) => IIS 400(错误请求)

    在 IIS 上加载期间 PHPExcel 导入失败

    visual-studio-code - 如何在 Visual Studio Code 的侧边栏中隐藏某些文件?