在以编程方式删除网站期间不会删除与 IIS 网站关联的信息
12/11/2020
本文内容
本文帮助您解决在以编程方式删除网站期间不删除与 IIS 网站关联的信息的问题。
原始产品版本: Internet Information Services 8.0,Internet Information Services 8.5
原始 KB 编号: 3202096
症状
请考虑以下情况:
通过使用对二进制公开的托管 API 的调用或对托管 API 的调用来 appcmd 删除 Microsoft.Web.Administration 网站。
在 IIS 7.5 Internet Information Services (版本中) 新建网站。
新网站仍使用已删除网站的旧元数据。
在此方案中,当您尝试访问新创建的网站时,将发生意外行为。 例如,您可能会在 Web 浏览器中收到 HTTP 503 - 服务不可用错误消息。
原因
当使用或 API 以编程方式执行 IIS 中现有网站的删除操作,并且该站点具有在 IIS 服务器的 ApplicationHost.config 文件的配置元素中定义的旧版属性 appcmd Microsoft.Web.Administration 时,会出现此问题。 在此方案中,不会删除标记中与网站 相关的信息。 如果在删除操作后创建了一个 ID 相同的新网站,则此新网站将与该旧网站的旧属性相关联。
解决方案
可以使用 IIS 管理控制台删除网站,而不是调用 appcmd 或 Microsoft.Web.Administration 。 此方法确保如果有与要尝试删除的网站关联的任何自定义旧属性,也会从 IIS 配置文件 (ApplicationHost.config) 。 这将防止这些属性意外与在重用旧已删除网站的 ID 的同一服务器上创建的新网站关联。
如果出于任何原因必须以编程方式删除网站并且无法使用 IIS 管理器控制台,可以添加两种解决方法之一,以确保通过元素与网站关联的旧属性的信息也会被删除。
解决方法 1:使用 appcmd 命令
如果使用 appcmd 删除网站,可以运行以下命令删除网站在 IIS 配置中可能具有的任何旧属性:
Appcmd clear config -section:customMetadata -[path='LM/W3SVC/']
备注
使用 appcmd 命令将参数替换为刚删除 的网站的标识符。
解决方法 2:使用对 Microsoft.Web.Administration 的调用
如果使用托管 API 调用删除网站,可以在删除网站后添加以下代码,以同时清除 IIS 配置元素中包含的旧 Microsoft.Web.Administration 属性:
string path = "LM/W3SVC/" + site.Id.ToString(CultureInfo.InvariantCulture);
string pathWithSlash = path + "/";
for (int i = customMetadata.Count - 1; i >= 0; i--) {
ConfigurationElement metadata = customMetadata[i];
string key = (string)metadata["path"];
if (key != null &&
(
key.Equals(path, StringComparison.OrdinalIgnoreCase) ||
key.StartsWith(pathWithSlash, StringComparison.OrdinalIgnoreCase))
)
{
customMetadata.RemoveAt(i);
}
}
备注
该 site 变量表示你刚刚使用 API 删除 Microsoft.Web.Administration 的网站。
重现步骤
在 Windows 2008 R2 / IIS 7.5 或 Windows 2012 R2 / IIS 8.5 服务器上:
安装 IIS 6 元数据库兼容性功能。
在 IIS 管理器中,创建第二个网站:调用 此 WebTest, 使其在任何所需应用程序池运行。
打开命令行提示符并导航 C:\inetpub\AdminScripts 到:
键入以下 adsutil.vbs SET w3svc/2/ServerSize "23" 命令:
这会将以下部分添加到应用程序文件中 W3SVC ApplicationHost.config 标记:
....
....
现在导航到 C:\windows\system32\inetsrv\ 命令提示符内部。
运行以下命令: appcmd delete site WebTest.
删除站点后,上述配置部分仍 存在于ApplicationHost.config。