【问题标题】:IIS: How to get the Metabase path?IIS:如何获取元数据库路径?
【发布时间】:2011-02-12 13:54:39
【问题描述】:

我正在尝试获取 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. 他说元数据库路径可能是别的东西;他举了一个例子来说明它可能是什么样的。

现在我和整个星球都在将“MetabasePath”硬编码为

iis://localhost/MimeMap

它应该是什么?代码应该做什么来构造一个有效的 MetabasePath?


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

【问题讨论】:

  • 从问题中不清楚,您是否遇到了安全异常?
  • 这不是安全例外。对DirectoryEntry(MetabasePath) 的调用返回正常,它返回一个对象。当您尝试访问任何返回的DirectoryEntry 对象的属性时,接下来会出现错误。它们都给出了 COM“未指定”错误。当路径无效时会发生这种情况,例如"iis://localhost/asdfadsf"
  • @Ian - 查看我的答案的更新。
  • @Ian - 我稍微调整了我的答案。
  • 这应该是服务器故障吗?

标签: iis iis-6 mime-types metabase


【解决方案1】:

如果您正在使用本地计算机的 IIS 配置,即您的代码和 IIS 在同一个框中,那么指定以下内容就足够了:

IIS://Localhost/mimemap

IIS: 部分在 OLE 用语中也称为绰号。

如果您打开 IIS6 元数据库文件 (C:\Windows\System32\inetsrv\metabase.xml),您会发现一个很大的 XML 'blob'。这实际上是一个扁平化的树结构。

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

名字对象IIS://localhost 映射到Location 路径/LM,这实际上是树根。

绰号 IIS://localhost/MimeMap 映射到 Location 路径 /LM/MimeMap

如果您的代码正在访问远程机器上的元数据库,那么可以指定IIS://[RemoteMachineName]/[path],而不是指定IIS://localhost/[path]。这就是 Chris Crowes 评论的意思。

IIS://localhost/MimeMap 也是主要的 Mime 类型列表。所有站点都继承此列表(IIS 元数据库严重依赖继承的属性)。

如果您想覆盖特定网站的 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 表示详尽、信息丰富,并且看起来您知道自己在说什么。我将不得不与实际遇到问题的开发人员(在两台机器上)联系,看看我们是否可以把我在这里学到的东西用来解决问题(并最终接受答案)
  • @Ian - 谢谢 :) - 我的一招小马正在编写 IIS 5/6/7 配置和管理系统,所以我已经沉浸在元数据库炼金术中几年了。
  • 我不能说。遇到此问题的开发人员表示它会自行修复;他们神奇地可以访问iis://localhost/MimeMap。他们似乎没有任何理由无法访问主 mimetype 列表。除非该文件实际上不存在。但我认为 IIS 会根据需要 创建 文件。但更令人困惑的是,它突然开始起作用了。我自己也看到了异常(因此创建对象时没有错误,但访问它们时出错) - 所以它们并不疯狂。
  • +1 仅用于C:\Windows\System32\inetsrv\metabase.xml。这为我解锁了许多以前神秘的路径设置。干杯
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多