我有一个Web应用程序,它在IIS虚拟应用程序下部署了两个虚拟目录。在IIS 6框中,以下代码按预期创建这些虚拟目录,但是在IIS 7框中,我最终得到的虚拟应用程序下面有两个其他虚拟应用程序,而不是一个虚拟应用程序下面有两个虚拟目录。我尝试了以下两种方法,但两者仍然创建了一个虚拟应用程序,而不是虚拟目录。如何更改此代码以部署所需的虚拟目录,而不是不需要的虚拟应用程序?
之一:
private void AddVirtualDir(DirectoryEntry entry)
{
DirectoryEntry virtualDirectory = (DirectoryEntry)entry.Invoke("Create", "IIsWebVirtualDir", "VirtualDirectory");
virtualDirectory.InvokeSet("Path", @"VirtualPath");
virtualDirectory.InvokeSet("AppFriendlyName", "VirtualDirectory");
virtualDirectory.Properties["AccessRead"][0] = true;
virtualDirectory.Properties["AccessScript"][0] = 512;
virtualDirectory.Properties["AppIsolated"].Clear();
virtualDirectory.Properties["AppIsolated"].Add(2);
virtualDirectory.Invoke("AppCreate", false);
virtualDirectory.CommitChanges();
entry.CommitChanges();
}
2:
private void AddVirtualDir(DirectoryEntry entry)
{
var virtualDirectory = entry.Children.Add("VirtualDirectory", "IIsWebVirtualDir");
virtualDirectory.Properties["AccessRead"][0] = true;
virtualDirectory.Properties["AccessScript"][0] = 512;
virtualDirectory.Properties["AppFriendlyName"][0] = "EditorControls";
virtualDirectory.Properties["AppIsolated"][0] = 2;
virtualDirectory.Properties["Path"][0] = Path.Combine(_INSTALLDIR, @"Kryptiq_Root\FormManagement\EditorControls");
virtualDirectory.CommitChanges();
entry.CommitChanges();
}
答案 0 :(得分:2)
这里的问题是您正在设置AppIsolated
值。在IIS6中,这用于配置应用程序的运行方式,通常您永远不需要触摸它或将其添加到任何位置。
AppIsolated
始终默认为2
,这意味着池化进程,即应用程序将在父应用程序的应用程序池中运行,或在AppPoolId
指定的池中运行。
存在其他值的原因是您可以将应用程序配置为在几种传统IIS5模式下运行 - 处理过程和进程外模式。
因此,除非您将网站的/root
应用程序配置为以AppIsolated="2"
以外的任何其他方式运行,否则您无需设置此值。
您的代码可以像以下一样简单:
using (var entry = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT"))
{
using (DirectoryEntry virtualDirectory = entry.Children.Add("MyVdir",
"IIsWebVirtualDir"))
{
virtualDirectory.Properties["Path"][0] = PATH_TO_MY_STUFF;
virtualDirectory.Properties["AccessRead"][0] = true;
virtualDirectory.Properties["AccessScript"][0] = 512;
virtualDirectory.CommitChanges();
}
}
如果你在IIS6中设置了AppIsolated
,它会被忽略,因为要使目录成为一个应用程序,你还需要设置AppRoot
。
在IIS7中使用System.DirectoryServices
时,您正在使用基础II6兼容性API,该API将这些ADSI调用转换为对新IIS7 API的调用。它并不完美,我怀疑当它看到AppIsolated
被设置时,假设您想要一个应用程序,尽管您没有指定任何其他与应用程序相关的元数据库值。
您可能知道这一点,但最好通过托管Microsoft.Web.Administration
位使用IIS7配置。并非所有ADSI /元数据库兼容性设置都具有IIS7中的等效设置,这可能会迫使转换层做出妥协以解决此问题。我在答案here和here中提到了这些类型的问题。