IIS 7:根据主机名启动唯一的站点实例

IIS 7:根据主机名启动唯一的站点实例

是否可以配置 IIS 7,以便具有多个绑定(或通配符绑定)的单个站点将为每个唯一的主机名启动一个唯一的实例?

为了解释为什么这是可取的,我们有一个从远程系统检索其配置的应用程序。应用程序的行为受此配置而不是“web.config”控制。应用程序使用其主机名作为检索配置的密钥。目前,这是一个手动过程,为应用程序的每个实例创建一个相同的 IIS 站点,仅在绑定方面有所不同。

我的想法是,如果可能的话,最好有一个 IIS 站点,可以有效地作为任意数量的动态站点的模板。每当通过唯一主机名访问时,都会启动该站点的新实例,并且对该主机名的所有后续请求都将转到该实例,就像我手动创建该站点一样。

我经常使用 IIS,但仅用于相当简单的网站托管。我想知道是否可以用原生 IIS 7 进行配置,但也欢迎需要插件或第三方产品的答案。

关于应用程序更改的编程/架构建议实际上并不适用于 serverfault。

答案1

根据我对 IIS 工作原理的理解,我认为这是不可能的。

Windows 进程激活服务 WAS 位于内核中的 http.sys 与运行应用程序池/站点的各种工作进程之间。

根据现有文件 (ApplicationHost.Config/web.config) 中的配置,它决定将传入请求路由到何处。如果尚未运行,它可以启动现有的 ApplicationPool,但无法根据 Web 请求创建新站点。

您可以将自己的扩展插入到请求处理管道中,但我认为只有在请求到达您的工作进程时才可以,而不是在此之前。

您可以编写自己的 ServiceHost 来替代 WAS,但我想这不是一项小任务。

我会开始使用脚本来创建网站的新实例,并传入变量。您可以轻松为所有不同的配置创建数百个网站。

如果必须更加动态,您可以向 Web 应用程序添加一项功能,该功能可检测是否需要新站点,它会显示“30 秒后回来”页面并向 Windows 服务发送一条消息以创建新站点。新站点应在几秒钟内启动,然后可以响应新请求。

答案2

您有几个选择。首先,我想确保我理解正确了您所说的“应用程序使用其主机名作为检索配置的密钥。”。您所说的“主机名”是指 IIS 网站名称,还是域名(通常称为主机名)?我假设您指的是 IIS 网站名称,因为您要为每个唯一的域名请求一个唯一的 IIS 站点。

URL Rewrite 提供了很大的灵活性,因此您可以随意覆盖或创建服务器变量,因此如果可能的话,如果您可以使用 IIS 站点名称以外的其他内容作为应用程序设置,这肯定会使这变得更容易。但是……您确实要求不提供编程/架构更改,所以我会回来具体回答您的问题。我只是想提一下,以防您还没有考虑过 URL Rewrite 提供的灵活性。

我处理您请求的方式是建立一个名为“Catch-all”的站点,该站点具有 IP 通配符绑定。该站点应具有 URL 重写规则,以确保所有请求(无论 URL 如何)都访问 createsite.aspx 页面。createsite.aspx 页面应采用域名 (Request.ServerVariables("HTTP_HOST")),并让其创建站点并指向共享文件夹。使用 Microsoft.Web.Administration 创建站点,并确保该站点的应用程序池在 IIS 框上具有管理员身份。以下是创建站点的方法 (http://blogs.msdn.com/b/carlosag/archive/2006/04/17/microsoftwebadministration.aspx)。

创建网站时,应为新域名添加主机标头绑定。这样,该域名的后续请求将始终由新网站而不是全包网站捕获。换句话说,全包网站仅在第一次使用特定域名时使用。

最后,createsite.aspx 页面应该执行 response.redirect 返回到原始 URL,包括传递完整路径和查询字符串。这样,如果最终用户恰好在 Fiddler 中观看,除了短暂的暂停和重定向之外,他们不会意识到刚刚发生了什么。

相关内容