1

我的网站有问题。服务器是 IIS 7,在 .NET 4.0 CLR 上运行 ASP.NET。我们正在托管一个 Sitecore 应用程序,我犹豫是否将其添加为标签,因为我真的觉得这更多的是问题的“为什么”,而不一定与导致问题的底层技术相关。

Sitecore 所做的其中一件事是添加大量自定义管道。其中一个管道称为LayoutResolverPipeline,它负责确定所请求页面将使用的布局文件的路径。我们提出了一种非常有用且复杂的跨多个域托管全局内容项的方法。哪个域将为哪些项目提供服务完全可以通过管理员 Web GUI(又名 Sitecore shell)进行配置。最终目标是让我们的营销/消费者体验团队能够运行多变量测试以找到最佳的用户体验。

为此,我们有一个“启动”页面,负责考虑有关当前用户的所有内容、有关当前系统和域设置的所有内容,并确定为客户提供哪种体验。对于大多数领域,这归结为骰子的加权掷骰 - 为了使测试结果在统计上合理,它们必须足够随机。它被编写为 anIHttpHandler并将其决定存储在中HttpContext.Current.Session(这也是通过让它实现IRequiresSessionState接口来完成的)。该决定被存储起来,以便如果客户决定回溯,我们不会再次掷骰子,而是在他们访问期间为他们提供一致的体验。该决定由处理程序执行,该处理程序为客户访问的下一页发出 302 重定向。

启动处理程序以通常的方式在 web.config 文件中定义:

<system.webServer>
<handlers>
    <add verb="*" path="launch.ashx"
       type="CMS.HttpHandlers.LaunchRequestHandler, CMS"
       name="LaunchHandler"/>

我们偶尔会与出于某种原因不希望在他们的页面和我们的页面之间出现结果 302 的合作伙伴开展业务。相反,他们将直接链接到特定的客户体验。然而,随着时间的推移,我们会贬低、移动或过时整个用户体验,这对于某些要求苛刻和懒惰的合作伙伴来说会导致指向不受支持或不存在的项目的挥之不去的链接。我们还必须处理人们输入错误、记忆错误、链接错误、从浏览器历史中重新访问或只是尝试随机 URL 的情况。

后一种情况导致LayoutResolverPipeline. 我试图通过让它回退到LaunchHandler如果它无法弄清楚该怎么做来解决这些异常。我已将此实现为重定向,但我想简单地LaunchHandler直接调用;无论如何,它将对不同的项目执行 301,并且在单个请求上进行多次重定向是我希望避免的昂贵的资源浪费。

足够的背景。问题是LayoutResolverPipeline绑定到HttpBeginRequestIIS 处理堆栈的一部分,这在 Session 信息准备好之前。这是 Sitecore 的一个限制,如果不解决一大堆其他问题,它就无法移动。

问题:

  1. IHttpHandler除了重定向到绑定的 URL 之外,有没有办法将控制权传递给特定对象?
  2. 有没有办法在事件管道中稍后重新加入代码?我想这意味着Application.PostAcquireRequestState仅针对单个请求绑定到事件,这听起来很可笑。
  3. 有没有办法尽早获取会话状态信息?

我当然愿意接受有关我可能会如何做完全错误的建议。哦,如果你知道一个更有用的标签可以专门用于 Asp.net/IIS 管道,我找不到一个不是阅读鲱鱼的标签。谢谢!

4

1 回答 1

1

我认为您不想手动调用任何处理程序……这听起来很老套。在这里使用Server.Transfer()而不是 301 重定向怎么样?然后它在用户端是透明的。当然,缺点是它不会更新明显的 URL,但是如果不进行某种重定向,您就无法做到这一点

于 2012-11-05T18:59:26.057 回答