0

这与源代码的版本控制无关。这是业务的要求以及它与各种供应商的交互方式,因此我正在尝试找出最好的方法来设置它。本质上,我们需要根据谁在访问站点来提供不同的主要版本的站点——而不是在 URL 中显示该版本。这是它现在的工作方式:

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

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

对于替代方案,我们研究了:

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

我没有要分享的代码,真的 - 它是专有的。我正在寻找更多的理论。如何设置如此疯狂的网站版本控制装置?

4

1 回答 1

0

玩了很多之后,我们找到了答案。Garath 上述评论的问题在于,虽然出站规则可以重写Html.ActionLinkand Html.BeginForm,但它们不能为RedirectToRouteorRedirectToAction和更多做任何事情。出站规则仅解析生成的 HTML 内容并在将其发送回浏览器之前对其进行更改。出站规则也与gzip不兼容,这可以理解但很烦人。

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

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

帮助我们的链接:

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

旁注 - 自定义重写提供程序必须以 .NET 2.0 为目标,上面第一个链接中没有提及。

于 2013-07-30T20:08:01.653 回答