【发布时间】:2013-04-11 12:01:38
【问题描述】:
我们目前看到使用 HttpContext.Current.Items 的问题,其中开发人员的本地环境在服务器环境中没有显示任何问题(所有工作都按预期工作)我们突然丢失了放置在其中的项目(获得 NullReferenceException) .
我草绘了一些代码并在下面使用:
Global.asax 我们在 BeginRequest 处初始化工厂:
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Items["Key"] = new Factory();
}
在BaseControl 中,我们有一个可以轻松检索工厂的属性:
public Factory Factory
{
get { return HttpContext.Current.Items["Key"] as Factory; }
}
在UserControl中我们通过base属性来使用它:
protected void Page_Load(object sender, EventArgs e)
{
Product p = Factory.CreateProduct();
}
环境信息:
- 本地 DEV 使用 IIS 7.5 和 8 以及 Sitecore 6.6 在 Windows 7 和 8 上运行
- 服务器正在使用 IIS 7.5 和 Sitecore 6.6 运行 Windows Server 2008 R2
对于所有本地开发人员(我们正在与 6 人一起开展此项目),上述代码没有问题。但是,一旦我们将代码部署到测试服务器,使用 Factory break 的位置(即 HttpContext.Current.Items 为空)
【问题讨论】:
-
可能是应用程序池重新启动?
-
@JPHellemons 如果是由于应用程序池重新启动,整个页面不应该呈现,只有使用工厂的组件会返回错误。
-
@IvanL 你试过
Application_AcquireRequestState吗?我怀疑Application_BeginRequest正在被所有请求调用(即使是 CSS、javascript 等),而HttpContext.Current在某些情况下可能不可用。 AquireRequestState 在管道中稍后发生,并且可以提供对HttpContext.Current.Items的更可靠的访问。只是猜测...... -
@DerekHunziker 我会试一试,遗憾的是我们的时间紧迫,所以现在我们已经创建了一个解决方法
-
@IvanL 你找到解决这个问题的方法了吗?我遇到了完全相同的问题
标签: c# asp.net sitecore httpcontext