Карта сайта случайным образом ломается со временем
У меня были некоторые ошибки производительности, которые я не совсем понимаю. Это произошло с нами на нескольких разных сайтах ASP.NET 4.0 (дрожь - да, я знаю - мы переносим его в MVC, но это занимает некоторое время).
Прежде всего, мы никогда не смогли воспроизвести эту проблему в средах разработки /QA. Во-вторых, после развертывания проблема, похоже, отсутствует. Иногда проблема проявляется в течение дня или двух из развертывания, и в другое время развертывание будет жить в течение месяца без его проявления вообще. Однако, как только это проявится, тогда ЛЮБАЯ страница, просматриваемая под веб-сайтом, вызывает ошибку. Наконец, эта проблема, похоже, появилась только после перехода на .NET 4.0. Мы начали с 2.0, год назад, поднявшись до 3.5, и недавно поднялись до 4.0 с этим решением и большинством дочерних проектов.
Ошибка:
Could not find the sitemap node with URL '~/Default.aspx'.
Упрощенная версия нашей карты сайта (с измененными именами и неинтересными узлами) выглядит следующим образом:
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode roles="*" title="EG">
<siteMapNode url="~/../SM/Default.aspx" title="Welcome" description="" roles="*" />
<siteMapNode url="~/../SD/Default.aspx" title="SD" description="" roles="*" />
<siteMapNode url="~/../SMD/Default.aspx" title="SMD" description="" roles="*" />
<siteMapNode url="~/Default.aspx" title="Ops" description="" roles="*" >
<siteMapNode url="~/Error.aspx" title="Error" hide="true" roles="*" />
<siteMapNode url="~/Public/Login.aspx" hide="true" roles="*" />
<siteMapNode url="~/Manager/LPCE.aspx" title="LPCE" description="" roles="Administrator, Manager, System, Marketer" imageUrl="~/../SM/images/icons/LF.jpg" />
</siteMapNode>
<siteMapNode url="~/../SDD/Default.aspx" title="SDD" description="" roles="*" />
<siteMapNode url="~/../CCD/Default.aspx" title="CCD" description="" roles="*" />
<siteMapNode url="~/../RD/Default.aspx" title="RD" description="" roles="*"/>
<siteMapNode url="~/../SBD/Default.aspx" title="SBD" description="" roles="*" />
</siteMapNode>
</siteMap>
Он зарегистрирован в нашем web.config:
<siteMap defaultProvider="SDXmlSiteMapProvider" enabled="true">
<providers>
<add name="SDXmlSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="true" />
<add name="SecurityDisabledSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="false" />
</providers>
</siteMap>
И из журналов я сузил то, что вызывает ошибку в базовом классе, из которого почти все наши страницы вытекают из:
private void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
SiteMapDataSource.StartingNodeUrl = "~/Default.aspx";
}
}
Я подтвердил на всех SiteMaps, что существует node с url = "~/Default.aspx" с role = "*" (который включает общедоступный/анонимный доступ), поэтому я очень смущен в отношении почему эта проблема возникает.
Проблемы, которые я рассмотрел:
- SiteMap не имеет node для Default.aspx. Все они делают.
- SiteMap Default.aspx node недоступен по соображениям безопасности для текущего пользователя/роли. Все они доступны анонимным пользователям, и эта проблема существует даже для пользователей супер администратора.
- Введенный URL содержит запросы (Default.aspx? abcd). Я не знаю, если это проблема (я уверен, надеюсь, что нет), но как только проблема проявится, я могу отписать URL без каких-либо запросов и проблема все еще существует.
- Изменяется SiteMap. Это не
- Разрешения на работу с файлом Sitemap. Карта сайта отлично работает после развертывания, поэтому, если разрешения не изменены так, как это исправлено IISRESET, это не проблема.
- Рабочий процесс становится глобально коррумпированным. Я так не думаю. У нас есть ~ 12 веб-сайтов в одном и том же пуле приложений, и проблема всегда остается на одном веб-сайте. Кроме того, нам еще предстоит сделать это более чем с одним веб-сайтом за один раз, хотя пока оно проявилось в 4 разных.
Может ли кто-нибудь пролить свет на это? Кажется, что динамически скомпилированный SiteMap поврежден или что-то в этом роде. Единственное разрешение, которое я нашел, это IISRESET
или эквивалент. И даже тогда, не сообщая, как долго проблема будет решена. Это ОЧЕНЬ расстраивает!
Ответы
Ответ 1
Я поставил предыдущую запись в этой теме, которая была удалена:( Так или иначе, у меня была такая же проблема.
Я обнаружил, что независимо от того, что я сделал, "Не удалось найти карту сайта node с URL-адресом" ~/rootnode ". Мой перерыв пришел, когда я решил удалить зависимость файловой системы и переключиться на SqlSiteMapProvider
из злого кода. Я обнаружил, что эта проблема была более надежно воссоздана.
Короче вы получите это сообщение, потому что нет карты сайта! Я обнаружил, что в источнике данных карты сайта, если вы используете StartingNodeUrl="~/root.htm"
, тогда сообщение об ошибке появится, когда нет созданной карты сайта. Однако, если вы используете StartingNodeOffset="0"
, тогда сообщение об ошибке не отображается и просто не отображается меню, когда карта сайта не построена.
Мне показалось странным, но я проследил его до XmlSiteMapProvider. Иногда он иногда создавался, и это не так. Не мог получить мою голову полностью под капотом, но это выглядело как нечто происходящее асинхронно. Во всяком случае, я переключился на SqlSiteMapProvider из wickedcode.
Одно изменение, которое я сделал, помимо преобразования в vb, - это сделать рекурсивный вызов для возврата переопределенного метода BuildSiteMap
:
' Return the root SiteMapNode
If _Root Is Nothing Then
Return Me.BuildSiteMap
Else
Return _Root
End If
Это гарантирует, что файл Sitemap будет создан. Я думал о том, чтобы включить бесконечный рекурсивный охранник, но это, похоже, не требуется.
Я все еще думаю, что, возможно, сетевое отставание или некоторая аутентификация (которая у нас происходит через контроллер AD, и утром уходит в первую очередь!) является то, что заставляет XmlSiteMapProvider пропускать окно Async build?
Надеюсь, это поможет.
Ответ 2
Хм. Это было через пару лет с тех пор, как я работал с ASP.net, но если я помню, у меня была аналогичная проблема, которую я решил с помощью
Page.ResolveURL("~SomePage.aspx");
Во время выполнения URL-адреса sitemap разрешены к фактическому URL-адресу, поэтому тильда удаляется и заменяется фактическим URL-адресом (я думаю:)).
Ответ 3
У меня есть две возможные идеи для этой проблемы. Не гарантируется и работа.; -)
-
Возможно ли, что вы также используете авторизацию URL-адреса
время в некоторых ваших файлах web.config, расположенных в разных папках
во всем веб-приложении?
Пример настройки авторизации URL-адреса, который можно найти в одном
Файл web.config:
<location path="bobsSecret.aspx">
<system.webServer>
<security>
<authorization>
<remove users="" roles="BobAndFriends" verbs="" />
<add accessType="Allow" users="Bob" />
</authorization>
</security>
</system.webServer>
</location>
Причина, по которой я упоминаю об этом, у меня была какая-то проблема в прошлом
для правильного использования свойства ролей в файле sitemap XML
с настройками, которые я применил в моей авторизации URL в файле web.config.
Единственное, что я мог себе представить, - это какое-то состояние гонки
где процесс, ответственный за обеспечение соблюдения этих политик,
чтение одной настройки безопасности в одном месте (web.config) до
читая его в другом месте (web.sitemap).
Просто удар в темноте, основанный на некоторых прошлых проблемах, которые у меня были
опытный!
-
В качестве второго варианта вы можете рассмотреть возможность установки этой конфигурации в
вашей страницы aspx, а не в событии Page_Load по коду позади.
Вы можете попробовать следующее:
<asp:SiteMapDataSource
id="SiteMapDataSource1"
runat="server"
StartingNodeUrl="~/Default.aspx">
</asp:SiteMapDataSource>
Таким образом, ваш StartNodeUrl указан на самой странице ASPX, и если это действительно прерывистая ошибка в коде Framework, возможно, это небольшое изменение может устранить проблему.