2010-08-02 10 views
11

Ho riscontrato degli errori di runtime di produzione che non comprendo completamente. Questo è successo a noi su un paio di siti Web ASP.NET 4.0 diversi (shudders - sì, lo so - lo stiamo trasferendo su MVC ma ci vorrà del tempo).Sitemap si spezza in modo casuale nel tempo

Prima di tutto, non siamo mai stati in grado di riprodurre questo problema negli ambienti di sviluppo/QA. In secondo luogo, al momento dell'implementazione, il problema sembra essere inesistente. A volte il problema si manifesta entro un giorno o due dalla distribuzione e altre volte la distribuzione sarà disponibile per un mese senza che si verifichi del tutto. Tuttavia, una volta che si manifesta, QUALSIASI pagina visualizzata sotto il sito web causa l'errore. Infine, questo problema sembrava emergere solo una volta migrata su .NET 4.0. Abbiamo iniziato a 2.0, un anno fa aumentato a 3,5, e recentemente aumentato a 4,0 con questa soluzione e la maggior parte dei progetti figlio.

L'errore: Could not find the sitemap node with URL '~/Default.aspx'.

Una versione semplificata della nostra mappa del sito (con alcuni nomi cambiati e nodi poco interessanti rimossi) è la seguente:

<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> 

Si è registrato nel nostro 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> 

E dai registri ho ristretto in basso che cosa causa l'errore in una classe base che praticamente tutto il nostro p età derivano da:

private void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     SiteMapDataSource.StartingNodeUrl = "~/Default.aspx"; 
    } 
} 

mi hanno confermato in tutte le SiteMaps che c'è un nodo con url = "~/Default.aspx" con ruoli = "*" (che comprende l'accesso del pubblico/anonimo), in modo da Sono molto confuso sul motivo per cui questo problema si verifica.

I problemi che hanno preso in considerazione:

  1. Mappa del sito non ha un nodo per Default.aspx. Tutti loro lo fanno.
  2. Il nodo Default.aspx di SiteMap non è accessibile per motivi di sicurezza all'utente/ruolo corrente. Sono tutti accessibili agli utenti anonimi e questo problema esiste anche per gli utenti super amministratori.
  3. L'URL inserito contiene querystrings (Default.aspx? Abcd). Non so se questo è un problema (sicuramente spero di no) ma una volta che il problema si manifesta, posso scrivere a mano l'URL senza querystring e il problema esiste ancora.
  4. Modifiche alla mappa del sito. Non
  5. Autorizzazioni del servizio al file Sitemap. La mappa del sito funziona perfettamente dopo una distribuzione, quindi, a meno che le autorizzazioni non vengano modificate in un modo che IISRESET corregge, non si tratta di un problema.
  6. Il processo di lavoro diventa globalmente corrotto. Io non la penso così. Abbiamo circa 12 siti Web tutti nello stesso pool di app e il problema rimane sempre confinato all'interno di un singolo sito web. Inoltre, dobbiamo ancora farlo accadere a più di un singolo sito Web alla volta, sebbene finora si sia manifestato in 4 diversi.

Qualcuno può far luce su questo? Sembra quasi che la SiteMap compilata dinamicamente venga danneggiata o qualcosa del genere. L'unica risoluzione che ho trovato è un IISRESET o equivalente. E anche allora, non si sa quanto a lungo il problema verrà risolto. Questo è MOLTO frustrante!

+0

Su quale server è ospitato? –

+0

Win 2003 R2 Standard – Jaxidian

+0

Abbiamo ancora questo problema e mi piacerebbe avere ancora una risposta per questo ... – Jaxidian

risposta

0

Hmm. Il suo stato un paio di anni da quando ho lavorato con ASP.net, ma se mi ricordo, ho avuto un problema simile che ho risolto con

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

In fase di esecuzione gli URL mappa del sito vengono risolti al URL reale, in modo che il tilde viene rimosso e sostituito con l'URL reale (penso :)).

+0

Dovrò dare una possibilità - grazie ! – Jaxidian

+0

BTW, questo non mi ha mai aiutato. – Jaxidian

+0

Quindi l'hai già risolto da solo? OSe così, altre persone potrebbero essere interessate a sapere come. Come ho detto, è passato un po 'di tempo. – Kell

0

Ho due possibili idee per questo problema. Né è garantito che funzioni. ;-)

  1. E 'possibile che si utilizza anche l'autorizzazione URL allo stesso tempo in alcuni dei vostri file web.config situato in varie cartelle in tutta l'applicazione web?

    impostazione

    Esempio URL di autorizzazione che potrebbe essere trovato in un unico file 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> 
    

    La ragione per cui dico questo è che ho avuto qualche problema in passato, cercando per ottenere la proprietà ruoli nella mia sitemap XML file per funzionare correttamente con le impostazioni che avevo applicato nella mia autorizzazione URL in un web.config.

    L'unica cosa che potevo immaginare sarebbe una sorta di condizione di competizione in cui il processo responsabile di far rispettare queste politiche è leggendo un'impostazione di protezione in un unico luogo (web.config) prima leggerlo in un altro luogo (web. Mappa del sito).

    Solo una pugnalata al buio, sulla base di alcuni problemi passati ho avuto esperienza !

  2. Come seconda opzione, si potrebbe valutare l'ipotesi di questa configurazione nel tua pagina aspx anziché nel Page_Load sul codice dietro. Si potrebbe provare questo:

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

    In questo modo lo StartingNodeUrl è specificato nella pagina ASPX in sé, e se questo è davvero un bug intermittente nel codice Framework, forse questo piccolo cambiamento potrebbe risolvere il problema.

2

ho messo un post precedente su questo thread che ha ottenuto cancellato :(comunque ho 'avuto' lo stesso problema.

ho scoperto che non importa quello che ho fatto il "Impossibile trovare il nodo sitemap con URL '~/rootnode "Si è verificata la mia interruzione quando ho deciso di rimuovere la dipendenza dal file system e passare a SqlSiteMapProvider da codice malevolo. Ho scoperto che questo problema è stato ricreato in modo più affidabile.

In breve si ottiene quel messaggio perché non esiste una mappa del sito! Ho trovato che sulla fonte dei dati della mappa del sito, se usi lo StartingNodeUrl="~/root.htm", verrà visualizzato il messaggio di errore quando non è stata creata una Sitemap. Tuttavia, se si utilizza StartingNodeOffset="0", il messaggio di errore non viene visualizzato e semplicemente non viene visualizzato alcun menu quando la Sitemap non viene creata.

Sembra strano per me, ma ho risalito a XmlSiteMapProvider. A volte è stato costruito a volte no. Non riuscivo a mettere la testa completamente sotto il cofano, ma sembrava che qualcosa accadesse in modo asincrono. Comunque sono passato a SqlSiteMapProvider da wickedcode.

Un cambiamento che ho fatto, a parte la conversione in VB è stato quello di mettere una chiamata ricorsiva sul ritorno del BuildSiteMap metodo ignorato:

' Return the root SiteMapNode 
If _Root Is Nothing Then 
    Return Me.BuildSiteMap 
Else 
    Return _Root 
End If 

Questo assicura la mappa del sito si basa. Ho pensato di inserire una guardia di ricorsione infinita, ma non mi sembra necessario.

Sto ancora pensando che forse un ritardo di rete o qualche autenticazione (che al nostro posto avviene tramite un controller AD e ritarda per prima cosa al mattino !!) è ciò che sta facendo perdere a XmlSiteMapProvider la finestra di build di Async?

Spero davvero che questo aiuti.