ASP.Net 4.0 - Ответ требуется в здании SiteMap?

Я сталкиваюсь с проблемой, обновляющей проект до.Net 4.0... и имеющей проблему, находящую любую причину проблемы (или по крайней мере, изменение, вызывающее его). Учитывая свежесть 4,0, не много блогов там для проблем все же, таким образом, я надеюсь, у кого-то здесь есть идея. Предисловие: это - приложение Веб-форм, появляющееся от 3,5 SP1 до 4,0.

В Application_Start событие мы выполняем итерации через SiteMap и создаем маршруты, базирующиеся от данных там (украшающий URL главным образом с некоторой добавленной утилитой), та часть не перестала работать, хотя... или по крайней мере не не получает это далеко.

Это кажется тем вызовом SiteMap. RootNode (внутри application_start) заставляет 4.0 есть его, начиная с XmlSiteMapProvider.GetNodeFromXmlNode метод был изменен, смотря в отражателе, Вы видите, что он совершает нападки HttpResponse.ApplyAppPathModifier здесь:

str2 = HttpContext.Current.Response.ApplyAppPathModifier(str2);

HttpResponse не использовался вообще в этом методе в 2,0 CLR, поэтому что мы хорошо работали, в 4,0, хотя, тот метод называют в результате этого стека:

[HttpException (0x80004005): Response is not available in this context.]
System.Web.XmlSiteMapProvider.GetNodeFromXmlNode(XmlNode xmlNode, Queue queue)
System.Web.XmlSiteMapProvider.ConvertFromXmlNode(Queue queue)
System.Web.XmlSiteMapProvider.BuildSiteMap()
System.Web.XmlSiteMapProvider.get_RootNode()
System.Web.SiteMap.get_RootNode()

С тех пор Response не доступно здесь в 4,0, мы получаем ошибку. Для репродуцирования этого можно сузить тестовый сценарий к этому в глобальном:

protected void Application_Start(object sender, EventArgs e)
{
  var s = SiteMap.RootNode; //Kaboom!
  //or just var r = Context.Response; 
  //or var r = HttpContext.Current.Response;
  //all result in the same "not available" error
}

Вопрос: я пропускаю что-то очевидное здесь? Или, есть ли другое событие, добавленное в 4,0, это рекомендуется для чего-либо связанного с SiteMap на запуске?

Для любого любопытного/желающего помочь, я создал очень минимальный проект (сайт ASP.Net 4.0 VS 2010 по умолчанию, все звонки и удаленный свист и только пустая карта сайта и Application_Start добавленный код). Это - маленькая zip 10 КБ, доступная здесь: http://www.ncraver.com/Test/SiteMapTest.zip


Обновление:

Не отличное решение, но текущее обходное решение состоит в том, чтобы выполнить в работе Application_BeginRequest, как это:

private static bool routesRegistered = false;
protected void Application_BeginRequest(object sender, EventArgs e)
{
  if (!routesRegistered)
  {
    Application.Lock();
    if (!routesRegistered) RouteManager.RegisterRoutes(RouteTable.Routes);
    routesRegistered = true;
    Application.UnLock();
  }
}

Мне не нравится это особенно, чувствует себя подобно злоупотреблению событием для обхода проблемы. У кого-либо есть, по крайней мере, лучшее обходное решение, так как поведение.Net 4 с SiteMap вряд ли изменится?

8
задан Nick Craver 24 December 2010 в 11:14
поделиться

1 ответ

Поскольку здесь не было никаких действий, оставляю это в качестве ответа, чтобы принять его позже, надеясь, что это поможет кому-то другому:

Мое текущее обходное решение (на самом деле обходной путь) заключается в том, чтобы сделать работа по инициализации, связанная с SiteMap , в Application_BeginRequest с проверкой того, что это произойдет один раз, например:

private static bool routesRegistered = false;
protected void Application_BeginRequest(object sender, EventArgs e)
{
  if (!routesRegistered)
  {
    Application.Lock();
    if (!routesRegistered) RouteManager.RegisterRoutes(RouteTable.Routes);
    routesRegistered = true;
    Application.UnLock();
  }
}

Если никто не ответит более подходящим методом в течение недели, я приму это , но я надеюсь есть способ получше / кое-что, что я пропустил.

6
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: