2013-04-11 2 views
2

В настоящее время мы видим проблему с использованием HttpContext.Current.Items, где локальные среды разработчиков не показывают проблем (все работает как ожидалось) в среде сервера, где мы внезапно теряем элементы, размещенные внутри (получение NullReferenceException).Элементы HttpContext ASP.NET исчезают на сервере

я набросал код и использовать ниже:

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 мы используем его через базовое свойство:

012 Информация
protected void Page_Load(object sender, EventArgs e) 
{ 
    Product p = Factory.CreateProduct(); 
} 

Окружающая среда:

  • Местные Devs работают на Windows 7 и 8 с помощью IIS 7.5 и 8 и Sitecore 6.6
  • Сервер работает под управлением Windows Server 2008 R2 с помощью IIS 7.5 и Sitecore 6.6

Для всех локальных DEV (мы работаем над этим проектом с 6 людьми) нет проблем с кодом, описанным выше. Однако, как только мы разместим код на тестовом сервере местоположения, которые используют перерыв Factory (Еа HttpContext.Current.Items пуст)

+0

Возможно, перезапуск пула приложений? –

+0

@JPHellemons Если это произойдет из-за перезапуска приложения, вся страница не должна отображаться, только компоненты, использующие фабрику, возвращают ошибки. – IvanL

+0

@IvanL вы пробовали 'Application_AcquireRequestState'? Я бы заподозрил, что «Application_BeginRequest» вызывается во всех запросах (даже для CSS, javascript и т. Д.), А «HttpContext.Current» может быть недоступен в некоторых случаях. AquireRequestState происходит позже в конвейере и может обеспечить более надежный доступ к «HttpContext.Current.Items». Просто догадка... –

ответ

0

Я могу представить только один сценарий, когда он ведет себя, как вы описали: в файле Global.asax в Inherits собственности на тестовый сервер указывает на Sitecore.Web.Application, непосредственно опустив выполнение вашего кода.

Могли бы вы дважды проверить, если файл Global.asax начинается с

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

Это может произойти, если Global.asax был изменен в вашем Dev enironment, но не была развернута в тестовой среде.

Если это не проблема, попробуйте проверить, выполняется ли на тестовом сервере Application_BeginRequest. Это даст вам ответ: Factory никогда не добавляется к HttpContext.Current.Items или удаляется из Items во время обработки запроса.

+0

Мы проверили это: Наследование файла global.asax верное, мы также выполнили файл Sitecore.Diagnostics.Log.Info и проверили что код выполняется. – IvanL

+0

Можете ли вы попробовать с переменной строки, переданной в 'Items' вместо экземпляра' Factory'? А также попробуйте выполнить регистрацию 'Request.RawUrl' для метода' BeginRequest' и 'Factory' getter? –

0

Я заметил, что вы используете то же имя для вашей собственности, как это тип:

public Factory Factory {} 

Может быть, это инициирует некоторое неожиданное поведение?

+0

Нет, фактический код имеет разные имена свойств класса, указанные имена упрощены. – IvanL