【发布时间】:2012-10-24 22:01:40
【问题描述】:
我的网站有问题。服务器是 IIS 7,在 .NET 4.0 CLR 上运行 ASP.NET。我们正在托管一个 Sitecore 应用程序,我犹豫是否将其添加为标签,因为我真的觉得这更多的是问题的“为什么”,而不一定与导致问题的底层技术有关。
Sitecore 所做的其中一件事是添加大量自定义管道。其中一个管道称为LayoutResolverPipeline,它负责确定所请求页面将使用的布局文件的路径。我们提出了一种非常有用且复杂的跨多个域托管全局内容项的方法。哪个域将为哪些项目提供服务完全可以通过管理员 Web GUI(又名 Sitecore shell)进行配置。最终目标是让我们的营销/消费者体验团队能够运行多变量测试以找到最佳用户体验。
为此,我们有一个“启动”页面,负责考虑有关当前用户的所有内容、有关当前系统和域设置的所有内容,并确定为客户提供哪种体验。对于大多数领域,这归结为骰子的加权掷骰 - 为了使测试结果在统计上合理,它们必须足够随机。它被编写为IHttpHandler,并将其决定存储在HttpContext.Current.Session 中(这也是通过实现IRequiresSessionState 接口来实现的)。该决定被存储起来,以便如果客户决定回溯,我们不会再次掷骰子,而是在他们访问期间为他们提供一致的体验。该决定由处理程序执行,该处理程序为客户访问的下一页发出 302 重定向。
启动处理程序以通常的方式在 web.config 文件中定义:
<system.webServer>
<handlers>
<add verb="*" path="launch.ashx"
type="CMS.HttpHandlers.LaunchRequestHandler, CMS"
name="LaunchHandler"/>
我们偶尔会与合作伙伴开展业务,他们出于某种原因不希望在他们的页面和我们的页面之间出现结果 302。相反,他们将直接链接到特定的客户体验。然而,随着时间的推移,我们会贬低、移动或过时整个用户体验,这对于某些要求苛刻和懒惰的合作伙伴来说会导致指向不受支持或不存在的项目的挥之不去的链接。我们还必须处理人们输入错误、记忆错误、链接错误、重新访问浏览器历史记录或只是尝试随机网址的情况。
后一种情况导致LayoutResolverPipeline 中出现一些令人讨厌的异常。我试图通过让它回退到LaunchHandler 来解决这些异常,如果它无法弄清楚该怎么做。我将此实现为重定向,但我想直接调用LaunchHandler;无论如何,它将对不同的项目执行 301,并且对单个请求进行多次重定向是我希望避免的昂贵的资源浪费。
足够的背景。问题是LayoutResolverPipeline 绑定到 IIS 处理堆栈的HttpBeginRequest 部分,这远远早于会话信息准备好。这是 Sitecore 的一个限制,如果不解决一大堆其他问题,它就无法移动。
问题:
- 除了重定向到绑定的 URL 之外,还有其他方法可以将控制权传递给特定的
IHttpHandler吗? - 有没有办法在事件管道中稍后重新加入代码?我想这意味着仅针对单个请求绑定到
Application.PostAcquireRequestState事件,这听起来很可笑。 - 有没有办法尽早获取会话状态信息?
我当然愿意接受有关我可能会如何做完全错误的建议。哦,如果你知道一个更有用的标签可以专门用于 Asp.net/IIS 管道,我找不到一个不是阅读鲱鱼的标签。谢谢!
【问题讨论】:
标签: asp.net session iis-7 sitecore httphandler