IIS - 如何最好地为不同用户提供不同版本的站点

时间:2013-07-25 23:58:16

标签: iis-7 url-rewriting httphandler httpmodule isapi

这与源的版本控制无关。这是业务的要求以及它与各种供应商的接口,因此我正在尝试以最佳方式设置它。基本上我们需要提供网站的不同主要版本,具体取决于谁在点击它 - 而在URL中显示该版本。以下是它现在的工作原理:

该站点是在IIS 7上运行的ASP.NET MVC 4.现在,它在IIS中设置了一个默认站点,下面是应用程序。每个应用程序都是该站点的一个版本。当初始请求到达站点时,它将通过自定义ISAPI筛选器运行。该过滤器从URL中获取本质上是用户ID变量的内容,并使用它来查询SQL数据库。此数据库将用户标识链接到需要提供的版本(IIS中的应用程序),并将其附加到URL的开头。因此http://site.com/1变为http://site.com/2.1.0.0/1,从而指向IIS中的正确目录。然后在站点内,自定义HtmlHelpers用于在创建锚链接或按钮等时从URL字符串中剥离版本。当用户点击其中一个链接时,它会重复。

这似乎不必要地复杂化。我不想使用自定义HtmlHelpers,只是默默地将请求重定向到IIS中的其他虚拟目录/物理路径。

对于替代方案,我们已经看过:

  • 在IIS中使用URL重写 - 但这需要版本在初始请求中进入,最终用户不会知道这一点。
  • 使用自定义HttpHandler - 但这需要一个网站已被命中 - 该请求已经很好地进入IIS。可能是我不太了解它是否有效。
  • 尝试不使用ISAPI过滤器重写URL而只重写虚拟目录/物理路径,但似乎没有任何钩子我们可以使用。
  • 创建一个调用HttpContext.RewritePath()的自定义HttpModule,但遇到了MVC路由和HtmlHelpers的问题,就好像没有HttpModule做任何事情一样。

我没有代码可以分享,真的 - 它是专有的。我正在寻找的是更多的理论。如何建立这样一个疯狂的网站版本控制装置?

1 个答案:

答案 0 :(得分:0)

经过更多的比赛后,我们找到了答案。 Garath上述评论的问题在于,虽然出站规则可以重写Html.ActionLinkHtml.BeginForm,但他们无法对RedirectToRouteRedirectToAction执行任何操作。出站规则仅解析生成的HTML内容并在将其发送回浏览器之前进行更改。出站规则也与gzip不兼容,这是可以理解但很烦人的。

简而言之,我们创建了一个自定义重写提供程序,它使用SQL连接来提取版本并返回正确的URL。我们还连接到IIS URL重写功能,以发送自定义服务器变量,以防止每个会话多次查询数据库。它的工作原理如下:

  1. 请求命中IIS URL重写模块
  2. 第一条规则检查cookie值,如果存在,则根据该值重写URL并停止处理更多规则。
  3. 如果cookie不存在,它会调用自定义提供程序,该提供程序使用SQL重写URL。
  4. 第二条规则还将标头中传递的自定义服务器变量设置为版本。
  5. 网站会检查该标头变量,如果设置,则会创建一个包含该版本的Cookie。
  6. 冲洗并重复。
  7. 帮助我们的链接:

    希望将来可以帮助其他人。

    附注 - 自定义重写提供程序必须以.NET 2.0为目标,这不在上面的第一个链接中。