В настоящее время мы видим проблему с использованием 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
мы используем его через базовое свойство:
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
пуст)
Возможно, перезапуск пула приложений? –
@JPHellemons Если это произойдет из-за перезапуска приложения, вся страница не должна отображаться, только компоненты, использующие фабрику, возвращают ошибки. – IvanL
@IvanL вы пробовали 'Application_AcquireRequestState'? Я бы заподозрил, что «Application_BeginRequest» вызывается во всех запросах (даже для CSS, javascript и т. Д.), А «HttpContext.Current» может быть недоступен в некоторых случаях. AquireRequestState происходит позже в конвейере и может обеспечить более надежный доступ к «HttpContext.Current.Items». Просто догадка... –