IIS:如何获取Metabase路径?

Ian*_*oyd 6 iis iis-6 metabase mime-types

我正在尝试获取IIS服务器已知的mime类型列表(您可以看到2年前我被问及并回答过).复制粘贴的答案包括:

GetObject("IIS://LocalHost/MimeMap") MSDN

GetObject("IIS://localhost/mimemap") KB246068

GetObject("IIS://localhost/MimeMap") Scott Hanselman的博客

new DirectoryEntry("IIS://Localhost/MimeMap")) 堆栈溢出

new DirectoryEntry("IIS://Localhost/MimeMap")) 堆栈溢出

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap") 速度评论


你明白了.每个人都同意你使用一个神奇的路径iis:// localhost/mimemap.这种方法效果很好,除非它没有.

唯一的线索我可以找到它失败的原因,来自IIS MVP,Chris Crowe,博客:

string ServerName = "LocalHost";
string MetabasePath = "IIS://" + ServerName + "/MimeMap";
    // Note: This could also be something like
    // string MetabasePath = "IIS://" + ServerName + "/w3svc/1/root";

DirectoryEntry MimeMap = new DirectoryEntry(MetabasePath);
Run Code Online (Sandbox Code Playgroud)

这里有两条线索:

  1. 他呼吁iis://localhost/mimemap配置数据库路径.这对我来说听起来像是" 元数据库 "的某种" 路径 ".
  2. 他说,元数据库可能是别的东西; 他举了一个例子,说明它可能是什么样的.

现在我和整个星球正在硬编码" MetabasePath "

iis://localhost/MimeMap
Run Code Online (Sandbox Code Playgroud)

它到底应该是什么?代码应该如何构建有效的MetabasePath?


注意:我没有收到访问被拒绝错误,当你有一个无效的MetabasePath时错误是相同的,例如 iis://localhost/SoTiredOfThis

Kev*_*Kev 6

如果您正在使用本地计算机的IIS配置,即您的代码和IIS位于同一个框中,则只需指定:

IIS://Localhost/mimemap

IIS:部分在OLE用语中也称为名字对象.

如果您打开IIS6配置数据库文件(C:\Windows\System32\inetsrv\metabase.xml),您将找到一个大的"blob"XML.这实际上是一个扁平的树形结构.

元数据库中的路径由Location属性表示.

名字IIS://localhost映射到实际上是树根的Location路径/LM.

名字IIS://localhost/MimeMap映射到Location路径/LM/MimeMap.

如果您的代码正在访问远程计算机上的元数据库,则可以指定IIS://localhost/[path],而不是指定IIS://[RemoteMachineName]/[path].这就是克里斯克劳斯的评论意味着什么.

IIS://localhost/MimeMap也是主Mime类型列表.所有站点都继承此列表(IIS Metabase严重依赖于继承的属性).

如果您想覆盖特定站点的Mime类型,那么您将修改:

IIS://localhost/W3SVC/[iisnumber]/ROOT/MimeMap

打开IIS元数据库文件并深入了解发动机罩下发生的情况是很有用的.

更新:

要回答有关为什么可以创建DirectoryEntry路径无效的对象的问题,DirectoryEntry是一个通用的包装器对象,用于绑定不同类型的ADSI提供程序,如IIS,LDAP和WinNT.它允许创建DirectoryEntry对象,其中可能不一定在指定的路径上有匹配的对象.某些ADSI提供商操作可能需要此功能.

DirectoryEntry调用时有一个静态方法Exists可用于测试对象的存在.例如:

// Does Default Website exist?
if(DirectoryEntry.Exists("IIS://localhost/w3svc/1"))
{
  // Do work...
}
Run Code Online (Sandbox Code Playgroud)