尝试创建“虚拟目录”会改为创建“虚拟应用程序”

时间:2012-01-26 22:59:15

标签: c# asp.net iis-7

我有一个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();
}

1 个答案:

答案 0 :(得分:2)

这在IIS6上如何工作

这里的问题是您正在设置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 - IIS6兼容性填充程序

在IIS7中使用System.DirectoryServices时,您正在使用基础II6兼容性API,该API将这些ADSI调用转换为对新IIS7 API的调用。它并不完美,我怀疑当它看到AppIsolated被设置时,假设您想要一个应用程序,尽管您没有指定任何其他与应用程序相关的元数据库值。

IIS7托管API更好

您可能知道这一点,但最好通过托管Microsoft.Web.Administration位使用IIS7配置。并非所有ADSI /元数据库兼容性设置都具有IIS7中的等效设置,这可能会迫使转换层做出妥协以解决此问题。我在答案herehere中提到了这些类型的问题。