Карта сайта случайно разрывается со временем - PullRequest
11 голосов
/ 02 августа 2010

У меня были некоторые производственные ошибки времени выполнения, которые я не до конца понимаю. Это случилось с нами на нескольких разных веб-сайтах ASP.NET 4.0 ( вздрагивает - да, я знаю - мы переносим это в MVC, но это занимает некоторое время).

Прежде всего, нам никогда не удавалось воспроизвести эту проблему в средах разработки / контроля качества. Во-вторых, после развертывания проблема, по-видимому, отсутствует. Иногда проблема проявляется в течение одного или двух дней после развертывания, а в другое время развертывание будет действовать в течение месяца без его проявления. Однако, как только это проявляется, то любая страница, просматриваемая под веб-сайтом, вызывает ошибку. Наконец, эта проблема, похоже, возникла только после того, как мы перешли на .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, что есть узел с url = "~ / Default.aspx" с role = "*" (который включает публичный / анонимный доступ), поэтому я очень запутался, почему это проблема возникает.

Проблемы, которые я рассмотрел:

  1. SiteMap не имеет узла для Default.aspx. Все они делают.
  2. Узел SiteMap Default.aspx недоступен из соображений безопасности для текущего пользователя / роли. Все они доступны для анонимных пользователей, и эта проблема существует даже для супер администраторов.
  3. Переданный URL-адрес содержит строки запроса (Default.aspx? Abcd). Я не знаю, если это проблема (я уверен, что надеюсь, что нет), но как только проблема проявляется, я могу написать URL без строк запроса, и проблема все еще существует.
  4. Изменения SiteMap. Это не
  5. Права доступа к файлу карты сайта. Карта сайта прекрасно работает после развертывания, поэтому, если разрешения не изменены таким образом, как это исправляет IISRESET, это не проблема.
  6. Рабочий процесс становится глобально поврежденным. Я так не думаю. У нас ~ 12 веб-сайтов в одном пуле приложений, и проблема всегда ограничивается одним веб-сайтом. Кроме того, нам еще предстоит сделать так, чтобы это происходило с более чем одним веб-сайтом за раз, хотя пока оно проявилось в 4 разных сайтах.

Кто-нибудь может пролить свет на это? Кажется, что динамически скомпилированный SiteMap поврежден или что-то в этом роде. Единственное разрешение, которое я нашел, - IISRESET или эквивалентное. И даже в этом случае невозможно сказать, как долго проблема будет решена. Это ОЧЕНЬ расстраивает!

Ответы [ 3 ]

2 голосов
/ 27 сентября 2012

Я поместил предыдущее сообщение в этой теме, которое было удалено :( В любом случае, у меня возникла та же проблема.

Я обнаружил, что независимо от того, что я делал, происходило «Не удалось найти узел карты сайта с 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

Это обеспечивает сборку карты сайта. Я думал о введении бесконечного рекурсивного охранника, но это, похоже, не требуется.

Я все еще думаю, что, возможно, задержка в сети или какая-то аутентификация (которая у нас происходит через контроллер AD, а первое время задерживается !!) - это то, что заставляет XmlSiteMapProvider пропустить это окно сборки Async?

Действительно надеюсь, что это поможет.

0 голосов
/ 15 сентября 2011

У меня есть две возможные идеи для этой проблемы.Ни один из них не гарантированно работает.; -)

  1. Возможно ли, что вы одновременно используете 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> 
    

    Причина, по которой я упоминаю это, в прошлом у меня были некоторые проблемы с попыткой получить свойство ролей в моемфайл XML файла Sitemap для корректной работы с настройками, которые я применил при авторизации URL-адреса в файле web.config .

    Единственное, что я могу себе представить, это какое-то состояние гонки, когда процесс, ответственный за применение этих политик, читает одно значение безопасности в одном месте (web.config), а затем читает его в другом месте (web.sitemap).).

    Просто удар в темноте, основанный на некоторых прошлых проблемах, с которыми я столкнулся!

  2. В качестве второго варианта вы можете рассмотреть возможность размещения этой конфигурации на странице aspx, а не в событии Page_Load в коде позади.Вы можете попробовать это:

    <asp:SiteMapDataSource
        id="SiteMapDataSource1"
        runat="server"
        StartingNodeUrl="~/Default.aspx">
    </asp:SiteMapDataSource>
    

    Таким образом, ваш StartingNodeUrl указан на самой странице ASPX, и, если это действительно периодическая ошибка в коде Framework, возможно, это небольшое изменение может решить проблему.

0 голосов
/ 29 ноября 2010

Хм.Прошло несколько лет с тех пор, как я работал с ASP.net, но, если я помню, у меня была похожая проблема, которую я решил с помощью

Page.ResolveURL("~SomePage.aspx");

Во время выполнения URL-адреса карты сайта были преобразованы в фактический URL-адрес, поэтомутильда удалена и заменена реальным URL (я думаю :)).

...