IIS:如何获取Metabase路径?

时间:2010-04-26 20:18:18

标签: iis iis-6 mime-types metabase

我正在尝试获取IIS服务器(which you can see was asked and and answered by me 2 years ago)已知的mime类型列表。复制粘贴的答案包括:

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

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

GetObject("IIS://localhost/MimeMap") Scott Hanselman's Blog

new DirectoryEntry("IIS://Localhost/MimeMap")) Stack Overflow

new DirectoryEntry("IIS://Localhost/MimeMap")) Stack Overflow

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap") Velocity Reviews


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

唯一的线索我可以找到它失败的原因,is from an IIS MVP, Chris Crowe's, blog

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);

这里有两条线索:

  1. 他呼叫iis://localhost/mimemap 元数据库路径。这对我来说听起来像是某种“路径”到“配置数据库”。
  2. 他说路径元数据库可能是其他的东西;他给出了一个可能是什么样子的例子。
  3. 现在我和整个星球正在硬编码“ MetabasePath

    iis://localhost/MimeMap
    

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


    注意:我没有收到拒绝访问错误,如果您的MetabasePath无效,则错误相同,例如: iis://localhost/SoTiredOfThis

2 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:0)

尝试执行此操作时,我遇到了返回0x80005000的问题。我的问题的愚蠢原因是我使用IIS7并且没有安装IIS6元数据库兼容性支持。