C# ASP.NET HttpContext项在服务器上消失

C# ASP.NET HttpContext项在服务器上消失,c#,asp.net,sitecore,httpcontext,C#,Asp.net,Sitecore,Httpcontext,目前,我们发现在使用HttpContext.Current.Items时出现了一个问题,即开发人员的本地环境在服务器环境中没有显示任何问题(一切正常),我们突然失去了放置在其中的项(获得NullReferenceException) 我在下面概述了一些代码和用法: Global.asax我们在BeginRequest初始化工厂: protected void Application_BeginRequest(object sender, EventArgs e) { HttpContex

目前,我们发现在使用
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
中,我们通过基本属性使用它:

protected void Page_Load(object sender, EventArgs e)
{
    Product p = Factory.CreateProduct();
}
环境资料:

  • 本地开发人员使用IIS 7.5和8以及Sitecore 6.6在Windows 7和8上运行
  • 服务器正在使用IIS 7.5和Sitecore 6.6运行Windows server 2008 R2

对于所有本地开发人员(我们正在与6人一起进行此项目),上述代码没有问题。但是,一旦我们将代码部署到测试服务器,使用工厂中断的位置(ea
HttpContext.Current.Items
为空)

当它的行为与您描述的一样时,我只能想象一种场景:在
Global.asax
文件中,测试服务器上的
继承
属性指向
Sitecore.Web.Application
直接忽略您的代码执行

您能否再次检查
Global.asax
文件是否以

<%@Application Language='C#' Inherits="My.Assembly.Namespace.Global" %>

如果在您的开发环境中更改了
Global.asax
,但尚未部署到测试环境中,则可能会发生这种情况


如果不是问题,请尝试检查
应用程序\u BeginRequest
是否在测试服务器上执行。它将为您提供一个答案,
工厂
是否从未添加到
HttpContext.Current.Items
,或者是否在请求处理过程中将其从
项目
中删除。

我注意到您对属性使用的名称与其类型相同:

public Factory Factory {}

可能这会引发一些意外行为?

可能是应用程序池重新启动?@JPHellemons如果是由于应用程序池重新启动导致的,则整个页面不应呈现,只有使用工厂的组件返回错误。@IvanL您是否尝试过
应用程序\u AcquireRequestState
?我怀疑所有请求(即使是CSS、javascript等)和HttpContext都调用了
Application\u BeginRequest
。在某些情况下,当前的可能不可用。AquireRequestState在管道中发生得较晚,可能提供对
HttpContext.Current.Items
更可靠的访问。只是一个猜测…@DerekHunziker我会尝试一下,很遗憾我们的日程安排很紧,所以现在我们已经创造了一个workaround@IvanL你找到解决这个问题的办法了吗?我遇到了完全相同的问题我们验证了这一点:global.asax文件继承是正确的,我们还执行了Sitecore.Diagnostics.Log.Info并验证了代码是否正在执行。您是否可以尝试将字符串变量传递到
而不是
工厂
实例?还可以尝试为
BeginRequest
方法和
Factory
getter记录
Request.RawUrl
?不,实际代码有不同的类属性名称,显示的名称会简化。