Я сталкиваюсь с проблемой, обновляющей проект до.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 вряд ли изменится?
Поскольку здесь не было никаких действий, оставляю это в качестве ответа, чтобы принять его позже, надеясь, что это поможет кому-то другому:
Мое текущее обходное решение (на самом деле обходной путь) заключается в том, чтобы сделать работа по инициализации, связанная с 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();
}
}
Если никто не ответит более подходящим методом в течение недели, я приму это , но я надеюсь есть способ получше / кое-что, что я пропустил.