Подтвердить что ты не робот

Карта сайта случайным образом ломается со временем

У меня были некоторые ошибки производительности, которые я не совсем понимаю. Это произошло с нами на нескольких разных сайтах 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 или эквивалент. И даже тогда, не сообщая, как долго проблема будет решена. Это ОЧЕНЬ расстраивает!

4b9b3361

Ответ 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, возможно, это небольшое изменение может устранить проблему.