处理 IIS Express 中的 URL 绑定失败

作者:Vaidy Gopalakrishnan

概述

IIS Express 设计用于在没有管理权限的情况下执行最常见的 Web 开发和测试任务。 例如,可以使用非保留端口在本地运行网站。 还可以使用自签名测试证书和 44300 到 44399 范围内的端口通过 SSL 测试网站。 有关详情,请参阅《在没有管理权限的情况下运行 IIS Express》。

但是,有时可能需要将 IIS Express 用于默认未启用的测试方案。 例如,尽管 IIS Express 的设计目的不是作为生产 Web 服务器(如 IIS),但你仍可能需要测试外部对网站的访问。 同样,你可能希望使用 SSL 或特定的保留端口号测试站点。

默认情况下,如果使用 IIS Express 测试这些方案,它将报告 URL 绑定失败。 之所以发生这种情况,是因为 IIS Express 没有足够的权限来执行这些类型的任务。 你可以以管理员身份运行 IIS Express 来绕过这些限制,但出于安全原因,这不是一个好的做法。

在这些方案中,使用 IIS Express 进行测试的正确方法是配置 HTTP.sys,以允许在标准权限下运行的 IIS Express 来执行任务。 测试完成后,可以还原配置。 出于安全原因,这些任务仅限于管理员,不能由标准(非管理员)用户执行。

关于 HTTP.sys

HTTP.sys 是一个操作系统组件,用于处理 IIS 和 IIS Express 的 HTTP 和 SSL 流量。 默认情况下,如果应用程序由标准用户运行,HTTP.sys会阻止应用程序(包括 IIS Express)执行以下操作:

  • 使用保留的端口(如 80 或 443)
  • 为外部流量提供服务
  • 使用 SSL

可以将 HTTP.sys 配置为允许 IIS Express 执行这些操作。 在 Windows 7 和 Windows Vista 上,可以使用 netsh.exe 实用工具配置 HTTP.sys。 在 Windows XP 上,可以使用 windows XP Service Pack 2 支持工具随附的httpcfg.exe命令行实用工具配置 HTTP.sys

使用保留的端口

默认情况下,可以使用 IIS Express 通过非保留端口(如 8080)运行网站。 但是,使用 80 或 443 等保留端口需要工作。 下面介绍的步骤假定你希望支持通过端口 80 的本地流量。

在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http add urlacl url=http://localhost:80/ user=everyone

此命令将允许任何用户的应用程序(包括你自己的 IIS Express 实例)使用端口 80 运行,而无需管理权限。 若要限制对自己的访问,请将“每个人”替换为你的 Windows 标识。

在 Windows XP 上,需要在提升的命令提示符下运行以下命令:

httpcfg set urlacl /u http://localhost:80/ /a D:(A;;GX;;;WD)

配置 HTTP.sys 后,可以将网站配置为使用端口 80。 使用 WebMatrix 和 Visual Studio 2010 SP1 Beta 等工具非常简单。 还可以手动编辑 applicationhost.config 文件,以在 sites 元素中添加以下绑定。

<binding protocol="http" bindingInformation="*:80:localhost"/>

网站现在将使用端口 80(本地)运行。

测试完应用程序后,应将 HTTP.sys 还原到其早期设置。

在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http delete urlacl url=http://localhost:80/

在 Windows XP 上,在提升的命令提示符下运行以下命令:

httpcfg delete urlacl /u http://localhost:80/

为外部流量提供服务

若要使网站能够处理外部流量,需要配置 HTTP.sys 和计算机的防火墙。 下面介绍的步骤假定外部流量将在端口 8080 上提供。

为外部流量配置 HTTP.sys 的步骤类似于设置站点以使用保留端口。 在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http add urlacl url=http://myhostname:8080/ user=everyone

在 Windows XP 上,在提升的命令提示符下运行以下命令:

httpcfg set urlacl /u http://myhostname:8080/ /a D:(A;;GX;;;WD)

配置 HTTP.sys 后,可以将 IIS Express 配置为使用端口 80,方法是使用 WebMatrix 或 Visual Studio 2010 SP1 Beta,或者编辑 applicationhost.config 文件以在 sites 元素中添加以下绑定。 (将 myhostname 替换为计算机的域名)。

<binding protocol="http" bindingInformation="*:8080:myhostname"/>

还需要配置防火墙,以允许外部流量流经端口 8080。 这些步骤将因所使用的防火墙而异,此处未介绍。

测试完应用程序后,将 HTTP.sys 还原到其早期设置。

在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http delete urlacl url=http://myhostname:8080/

在 Windows XP 上,在提升的命令提示符下运行以下命令:

httpcfg delete urlacl /u http://myhostname:8080/

使用自定义 SSL 端口

如果要测试对站点的 SSL 访问,可以使用 44300 到 44399 之间的 SSL 端口以及 IIS Express 自签名证书通过 IIS Express 执行此操作。 尝试将此范围之外的端口用于 SSL 会导致在 IIS Express 下启动网站时出现 URL 绑定失败。

有关如何配置 HTTP.sys 以支持 SSL 的常规说明,请参阅《如何使用 SSL 证书配置端口》。 例如,假设你想要使用 URL https://localhost:443 测试网站。

首先,确定 IIS Express 自签名证书的 SHA1 指纹。 对于每台计算机,此指纹不同,因为 IIS Express 安装程序在执行时会生成新证书。 可以通过查看计算机的个人证书存储,使用 Microsoft 管理控制台 (MMC) 证书管理单元来确定 SHA1 指纹。 或者,可以使用 .NET CertMgr.exe 实用工具,如下所示。 在命令提示符下,运行以下命令:

certmgr.exe /c /s /r localMachine MY

此命令显示有关本地计算机个人证书存储中所有证书的信息。 在输出中搜索“IIS Express 开发证书”,找到 IIS Express 自签名证书,然后记下其 SHA1 指纹。

接下来,将 HTTP.sys 配置为将自签名证书与 URL 相关联。 在 Windows 7 或 Windows Vista 上,首先使用 uuidgen.exe 或其他工具创建唯一的 UUID。 然后在提升的命令提示符下运行以下命令,将指纹传递给 certhash 参数。 (指定指纹时排除空格。)

netsh http add sslcert ipport=0.0.0.0:443 certhash=<thumbprint> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

对于 appid 参数,传递之前创建的唯一 UUID。

在 Windows XP 上,在提升的命令提示符下运行以下命令。

httpcfg set ssl -i 0.0.0.0:443 -h <thumbprint>

由于 443 是保留端口,因此还需要配置 HTTP.sys,以允许 IIS Express 在以标准用户身份运行时使用它。 有关详细信息,请参阅“使用保留端口”部分。 如果使用非保留的自定义 SSL 端口(如 44500),则无需执行此步骤。

在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令。

netsh http add urlacl url=https://localhost:443/ user=everyone

在 Windows XP 上,在提升的命令提示符下运行以下命令。

httpcfg set urlacl /u https://localhost:443/ /a D:(A;;GX;;;WD)

配置 HTTP.sys 后,请将网站配置为使用 WebMatrix 或 Visual Studio 2010 SP1 Beta 的自定义 SSL 端口,或者在 applicationhost.config 文件中的 sites 元素中添加以下绑定。

<binding protocol="https" bindingInformation="*:443:localhost"/>

测试完应用程序后,将 HTTP.sys 还原到其早期设置。 在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http delete sslcert ipport=0.0.0.0:443
netsh http delete urlacl url=https://localhost:443/

在 Windows XP 上,在提升的命令提示符下运行以下命令:

httpcfg delete ssl –i 0.0.0.0:443
httpcfg delete urlacl /u https://localhost:443/

配置自定义 SSL 证书

设置自定义 SSL 证书与使用自定义 SSL 端口非常相似。 本节中所述的步骤假定网站已在使用端口 44300 和 IIS Express 自签名证书提供本地 SSL 流量。

首先,需要在计算机上安装自定义 SSL 证书。 使用 MMC 证书管理单元或 CertMgr.exe。 安装证书时,请注意 SHA1 指纹值。

该 URL https://localhost:44300 由 IIS Express 安装程序预配置为使用自签名证书。 若要将此 URL 绑定到自定义证书,必须删除现有关联。 如果主机名和端口组合未与 SSL 证书关联,请跳过此步骤。

在 Windows 7 或 Windows Vista 上,在提升的命令提示符下运行以下命令:

netsh http delete sslcert ipport=0.0.0.0:44300

在 Windows XP 上,在提升的命令提示符下运行以下命令:

httpcfg delete ssl –i 0.0.0.0:44300

其余步骤类似于用于配置自定义 SSL 端口的步骤。 使用 uuidgen.exe 或其他工具创建唯一的 UUID。

在 Windows 7 或 Windows Vista 上,在提升的提示符下运行以下命令,将自定义证书的指纹(首先删除任何空格)传递到 certhash 参数并传递 UUID。

netsh http add sslcert ipport=0.0.0.0:44300 certhash=<thumbprint> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

在 Windows XP 上,在提升的命令提示符下运行以下命令。

httpcfg set ssl -i 0.0.0.0:44300 -h <thumbprint>

总结

本文介绍了为默认情况下未启用的 IIS Express 支持某些方案所需的步骤。 执行它们需要成为管理员。 即使你没有管理权限,你仍然可以使用 IIS Express 作为标准用户执行最常见的 Web 设计和开发任务。