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>根应用程序中的默认值告诉我们:
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总是相对于父应用程序pathpath如/vdir_1和.../sub_dir1成为虚拟目录的名称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管理器中:

希望这有助于解释站点,应用程序和虚拟目录之间的关系.
| 归档时间: |
|
| 查看次数: |
22203 次 |
| 最近记录: |