【问题标题】:IIS 7.5 applicationHost.config file is not being updatedIIS 7.5 applicationHost.config 文件未更新
【发布时间】:2011-08-07 11:54:53
【问题描述】:

我目前正在使用 Microsoft.Web.Administration (MWA) 命名空间,以便调整我们的应用程序以使用新 API 配置 IIS 7.5。 我知道所有 IIS 级别的更改都应该在以下文件中表示(我在 Win2K8-R2 上):

%WINDIR%\System32\inetsrv\config\applicationHost.config

所以,当我使用ServerManager 对象提交配置更改时,文件应该相应地更新。

添加新的 MIME 类型(使用 MWA 进行编程)后,我在 applicationHost.config file 中没有看到任何更改,但我确实在 IIS 管理器窗口中看到了新的 MIME 类型,并且 IIS 可以毫无问题地识别此 MIME 类型。即使在重新启动操作系统后 - 配置文件不包含新添加的 MIME 类型,但 IIS 管理器窗口确实列出了它。

因为我的应用程序池被强制为 32 位(Enable32BitAppOnWin64 = true),我认为相关的配置文件应该位于%WINDIR%\SysWOW64\inetsrv\Config 下,但是(如果它存在...) - 之后它也不会改变代码提交更新。

有人可以解释一下吗?我是否遗漏了什么(可能是查看了错误的文件?)?有人可以解释一下SysWOW64\inetsrv\config 目录吗?

这是我添加 MIME 类型的代码:

ServerManager manager = new ServerManager();
ConfigurationElementCollection staticContentCollection = manager
    .GetApplicationHostConfiguration()
    .GetSection("system.webServer/staticContent")
    .GetCollection();

//MIMETypes is a string[] array, each object is {FileExt},{MIMETypeStr}
foreach (string pair in MIMETypes)
{
    string[] mimeProps = pair.Split(',');

    ConfigurationElement mimeTypeEl = staticContentCollection
          .Where(a => 
                   (string)a.Attributes["fileExtension"].Value == mimeProps[0])
          .FirstOrDefault();


    if (mimeTypeEl != null)
    {
        staticContentCollection.Remove(mimeTypeEl);
    }

    ConfigurationElement mimeMapElement = 
                  staticContentCollection.CreateElement("mimeMap");

    mimeMapElement["fileExtension"] = mimeProps[0];
    mimeMapElement["mimeType"] = mimeProps[1];

    staticContentCollection.Add(mimeMapElement);
}

manager.CommitChanges();

//At this point all is working but the config file does not reflect the change

【问题讨论】:

    标签: iis-7.5 mime-types applicationhost


    【解决方案1】:

    我刚刚尝试了您的代码,它运行良好。您知道此 mime 类型是添加到全局 mime 类型集合而不是站点中吗?

    它也会添加到<staticContent> 列表的末尾,当您执行ServerManager.CommitChanges() 时,此列表不会重新排序。

    同样在 Windows 2008-R2 上,applicationHost.config 的正确位置是:

    C:\Windows\System32\inetsrv\config

    我猜你正在使用 notepad.exe 或 NotePad2 打开这个文件(32 位编辑器无法打开它)。记事本不会在更改后重新加载文件,并且需要告知 NotePad2 显示文件更改通知 (alt-F5),开箱即用不会。

    还可以尝试添加一些不寻常的东西,例如.xxx,运行更新,然后打开配置文件并进行搜索。我保证它会在那里。

    更新:

    除了下面的 cmets,我不确定您如何使用 NotePad++ 或任何 32 位编辑器打开 applicationHost.config,我当然不能。你能下载64位编辑器NotePad2吗?

    http://www.flos-freeware.ch/notepad2.html

    候选版本运行良好。

    在任何 64 位 Windows 2008 或 Windows 7 的默认安装中,C:\Windows\SysWOW64\inetsrv\Config 文件夹中不应有 applicationHost.config。我不知道你为什么会在那里看到一个。

    【讨论】:

    • 我再次检查了它,重点是文本查看器。如果我使用 Notepad++ 或 VS2010(均为 32 位)打开配置文件 - 更改不存在。但是...如果我使用本机记事本应用程序(64 位)打开文件,更改就在那里!这里的东西闻起来不太好...好像 FS 重定向 (msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx) 或这个问题:support.microsoft.com/kb/942589,不知怎么玩得不太好...对 64 位文本编辑器有什么建议吗?
    • 还有一种黑客方法可以通过滥用 UNC 路径在 32 位应用程序中打开 applicationHost.config 文件。不要导航到磁盘上的目录,而是使用 UNC 路径(例如 \\192.168.1.100\C$\Windows\System32\inetsrv\config)
    • 使用 64 位编辑器而不是 32 位编辑器编辑文件是一种新的巫术。
    • @Kev:我一整天读过的最有用的东西。谁能想到使用 32 位应用程序无法正确打开/保存。
    • 另一种不使用 UNC 路径访问此文件的方法是使用 Sysnative alias:notepad++ %SystemRoot%\Sysnative\inetsrv\config\applicationHost.config(您无法使用资源管理器访问此路径,因为它仅对 32 位应用程序可见)
    【解决方案2】:

    作为使用您最喜欢的 64 位兼容的 32 位编辑器(即 Notepad++)打开和编辑 64 位 IIS 配置文件的解决方法,您可以创建一个指向 C:\Windows\System32\inetsrv\Config 的 Windows 目录符号链接。使用此方法,您将替换位于C:\Windows\SysWOW64\inetsrv\Config 的32 位Config 目录以指向64 位版本。例如,如果您的应用程序需要 32 位和 64 位版本,则此方法将不起作用。

    如需更多信息,我强烈建议您访问this MSDN Blog

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多