我正在使用 ServerManager (Microsoft.Web.Administration.dll) 在 IIS 7 上的网站内创建一个应用程序。
我需要在这个应用程序中创建一个应用程序或将一个虚拟目录转换为一个应用程序(如iis管理器功能右键单击->转换为应用程序)
这如何可行?我发现关于这个库的文档很少,而且没有一个提到这个特定的功能。
谢谢。
最佳答案
这样做的方法是操纵Site.Applications
集合,它是站点中所有应用程序的扁平树。
为了这些示例,我们假设一个名为“MySite”的站点,其中的内容位于本地硬盘上:d:\mysite\www
.该站点的 IIS 号是 3
并且站点驻留在它自己的应用程序池中,也称为“MySite”。
我们还将假设站点的以下文件夹结构
首先,我们获取要添加应用程序的站点,我们将使用变量 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 管理器中看到了这一点:
将虚拟目录添加到现有虚拟目录:
如果我们想添加一个子虚拟目录到
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 管理器:
添加虚拟目录时需要记住以下几点:
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 中,我们看到:
这相当于右键单击“转换为应用程序”。
将应用程序添加到现有应用程序:
添加应用程序作为现有应用程序的子项非常简单。说我们要制作
/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";
结果配置如下所示:
<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 中:
将虚拟目录添加到应用程序:
现在,如果我们想向这个应用程序添加一个虚拟目录,我们可以这样做:
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 中,我们看到:
再次重要的是要注意虚拟路径
/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 管理器中,我们看到:
将应用程序添加到现有虚拟目录:
如果我们想将应用程序添加到虚拟目录会发生什么,它是如何工作的?在本例中,我们将向虚拟目录
/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 管理器中,我们看到:
将现有子文件夹转换为应用程序:
作为最后一个例子,我们要转
/other_apps/sub_app_1
进入应用程序:我们的代码看起来像:
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 管理器中:
希望这有助于解释站点、应用程序和虚拟目录之间的关系。
关于c# - 使用 ServerManager 在应用程序中创建应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4518186/