我在IIS 7.0中面临一个奇怪的问题:
并且在IIS中的虚拟目录上仅启用了Windows身份验证模式
现在,如果我尝试以这种方式为TestV / Folder / file.aspx获取关联的DirectoryEntry:
string vDir = @"/TestV/folder/file.aspx";
DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
dir.AuthenticationType = AuthenticationTypes.Secure;
try
{
Console.WriteLine(dir.Name);
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
Console.WriteLine("");
我得到了例外: “系统找不到指定的路径”
现在,如果我返回IIS,然后执行以下步骤: 右键单击TestV / Folder 并启用匿名身份验证模式,然后再次禁用
右键单击TestV / Folder / file.aspx 并启用匿名身份验证模式,然后再次禁用
基本上我只是在aspx文件Testv / Folder / file.aspx上执行了一些手动访问。
完成上述步骤后,如果我重新运行程序,代码就能成功访问目录条目并成功打印名称(file.aspx)
这里有什么问题?
还有一个信息:
我也在IIS 6.0上看到了这种行为。所以看起来除非我在IIS中为虚拟目录中的文件夹/文件做一些手动操作,否则它不会在活动目录中创建相应的元数据?
答案 0 :(得分:1)
我得到了问题的答案(在我的一位同事的帮助下)
以下是解决方案: 1.在访问条目之前,程序需要在访问虚拟目录下的文件/文件夹之前向IIS元数据添加(伪?)条目:
try
{
// make pseudo entries:
DirectoryEntry folder = rootDir.Children.Add("Folder", "IISWebDirectory");
folder.CommitChanges();
file = folder.Children.Add("File.aspx", "IISWebFile");
file.CommitChanges();
}
然后瞧它工作
PS:
DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
dir.AuthenticationType = AuthenticationTypes.Secure;
dir.RefreshCache();
Directory.Refresh无效
答案 1 :(得分:0)
如果你在第三行之后调用RefreshCache()会有帮助吗?
DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
dir.AuthenticationType = AuthenticationTypes.Secure;
dir.RefreshCache();
答案 2 :(得分:0)
虽然这不是一个答案,但我会指出System.DirectoryServices通常不用于与IIS交互。虽然它可以让您访问IIS设置,但WMI通常是更好的选择。