我的网站有问题。服务器是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的约束,如果不解决其他问题,就不能移动它。
问题:
IHttpHandler
?Application.PostAcquireRequestState
事件,这听起来很荒谬。我当然乐于接受关于我如何完全错误的建议。哦,如果你知道一个更有用的标签专门用于Asp.net/IIS管道,我找不到一个不是读鲱鱼。谢谢!
答案 0 :(得分:1)
我认为你不想手动调用任何处理程序......听起来很糟糕。如何在此处使用 Server.Transfer()而不是301重定向?然后它在用户端是透明的。当然缺点是它没有更新明显的URL,但如果没有某种类型的重定向,你就无法做到这一点。