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

本文关键字:服务器 消失 NET HttpContext ASP | 更新日期: 2023-09-27 18:08:52

我们目前看到一个使用HttpContext.Current.Items的问题,在服务器环境中,开发人员的本地环境显示没有问题(所有工作如预期),我们突然丢失了放置在里面的项目(获得NullReferenceException)。

我在下面画了一些代码和用法:

全球。当我们初始化工厂在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();
}
环境信息:

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

对于所有本地开发人员(我们有6个人在这个项目上工作),上面描述的代码没有问题。然而,一旦我们将代码部署到测试服务器,使用工厂分隔符的位置(如果HttpContext.Current.Items为空)

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

我可以想象只有一个场景,当它的行为像你所描述的:在Global.asax文件的Inherits属性测试服务器指向Sitecore.Web.Application直接省略你的代码执行。

你能再检查一下Global.asax文件是否以

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

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

如果不是问题,试着检查Application_BeginRequest是否在测试服务器上执行。它会给你一个答案是否Factory从未添加到HttpContext.Current.Items或是否在请求处理期间从Items中删除。

我注意到你的属性使用相同的名称,因为它的类型:

public Factory Factory {}

也许这会引发一些意想不到的行为?