2010-08-02 14 views
11

He estado teniendo algunos errores de tiempo de ejecución de producción que no entiendo completamente. Esto nos ha sucedido en un par de sitios web ASP.NET 4.0 diferentes (estremecimientos - sí, lo sé - estamos portándolo a MVC, pero eso lleva algo de tiempo).Sitemap se rompe aleatoriamente con el tiempo

En primer lugar, nunca hemos sido capaces de reproducir este problema en entornos de desarrollo/control de calidad. En segundo lugar, al momento del despliegue, el problema parece ser inexistente. A veces, el problema se manifiesta dentro de un día o dos de implementación y otras veces la implementación estará activa durante un mes sin que se manifieste en absoluto. Sin embargo, una vez que se manifiesta, CUALQUIER página vista bajo el sitio web causa el error. Por último, este problema parecía surgir una vez que migramos a .NET 4.0. Comenzamos en 2.0, hace un año aumentó a 3.5, y recientemente subimos a 4.0 con esta solución y la mayoría de los proyectos para niños.

El error: Could not find the sitemap node with URL '~/Default.aspx'.

Una versión simplificada de nuestro mapa del sitio (con algunos nombres cambiados y sin interés nodos eliminados) es el siguiente:

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

Está registrada en nuestro 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> 

Y de los registros he reducido lo que hace que el error se encuentre en una clase base que casi toda nuestra p edades derivan de:

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

He confirmado en todos los Sitemaps que existe un nodo con url = "~/Default.aspx" con los roles = "*" (que incluye el acceso público/anónimo), por lo Estoy muy confundido sobre por qué ocurre este problema.

Los problemas que han tenido en cuenta:

  1. Mapa del Sitio no tiene un nodo para Default.aspx. Todos ellos lo hacen.
  2. No se puede acceder al nodo Default.aspx de SiteMap por razones de seguridad para el usuario/rol actual. Todos son accesibles para usuarios anónimos y este problema incluso existe para usuarios súper administradores.
  3. URL pasada contiene cadenas de consulta (Default.aspx? Abcd). No sé si esto es un problema (seguro que no) pero una vez que el problema se manifiesta, puedo escribir la URL sin cadenas de caracteres y el problema persiste.
  4. Cambios en el mapa del sitio. No
  5. Permisos del servicio al archivo del mapa del sitio. El mapa del sitio funciona perfectamente bien después de una implementación, por lo tanto, a menos que los permisos se modifiquen de manera que IISRESET corrija, entonces esto no es un problema.
  6. El proceso de trabajo se vuelve corrupto a nivel mundial. No lo creo. Tenemos ~ 12 sitios web en el mismo conjunto de aplicaciones y el problema siempre permanece confinado dentro de un único sitio web. Además, todavía tenemos que suceder esto a más de un único sitio web a la vez, aunque se ha manifestado en 4 diferentes hasta el momento.

¿Alguien puede arrojar algo de luz sobre esto? Casi parece que el SiteMap compilado dinámicamente se corrompe o algo así. La única resolución que he encontrado es IISRESET o equivalente. Y aun así, no se sabe cuánto tiempo se resolverá el problema. ¡Esto es MUY frustrante!

+0

¿En qué servidor está alojado este sistema? –

+0

Win 2003 R2 Standard – Jaxidian

+0

AÚN tenemos este problema y TODAVÍA me gustaría tener una respuesta para esto ... – Jaxidian

Respuesta

0

Hmm. Ha sido un par de años desde que trabajó con ASP.net, pero si no recuerdo mal, tuve un problema similar que he resuelto con

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

En tiempo de ejecución de las direcciones URL mapa se resuelven a la URL real, por lo que la tilde se elimina y se reemplaza con la URL real (creo :)).

+0

Tendré que darle una oportunidad - gracias ! – Jaxidian

+0

Por cierto, esto nunca me ayudó. – Jaxidian

+0

¿Ya lo ha resuelto usted mismo? De ser así, otras personas pueden estar interesadas en saber cómo. Como dije, ha pasado un tiempo. – Kell

0

Tengo dos posibles ideas para este problema. Tampoco está garantizado que funcione. ;-)

  1. ¿Es posible que también está usando autorización de direcciones URL al mismo tiempo en algunos de sus archivos web.config se encuentra en varias carpetas a través de su aplicación web?

    entorno

    Ejemplo autorización de direcciones URL que se podría encontrar en un archivo 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 razón por la que menciono esto es que tuve algunos problemas en el pasado tratando para obtener la propiedad papeles en mi mapa del sitio XML para que funcione correctamente con la configuración que había aplicado en mi Autorización de URL en un web.config.

    La única cosa que podía imaginar sería algún tipo de condición de carrera donde el proceso responsable de hacer cumplir estas políticas se leyendo una configuración de seguridad en un solo lugar (web.config) antes leerlo en otro lugar (site. mapa del sitio).

    ¡Solo una puñalada en la oscuridad, basada en algunos problemas pasados ​​que tuve experimentado!

  2. Como segunda opción, se podría considerar la posibilidad de esta configuración en su página aspx en lugar de en el evento Page_Load en el código subyacente. Usted podría intentar esto:

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

    De esta manera su StartingNodeUrl se especifica en la página ASPX en sí, y si este es realmente un fallo intermitente en el código marco, tal vez este ligero cambio puede solucionar el problema.

2

pongo un post anterior sobre este tema, que se eliminó :(de todas formas yo 'tenía' el mismo problema.

me encontré con que no importa lo que hice el "No se pudo encontrar el nodo mapa con Se produjo la URL '~/rootnode'. Mi ruptura llegó cuando decidí eliminar la dependencia del sistema de archivos y cambiar al código SqlSiteMapProvider. Encontré que este problema se volvió a crear de manera más confiable.

En resumen, recibe ese mensaje porque no hay un mapa del sitio. Descubrí que en el origen de datos del mapa del sitio si usa el StartingNodeUrl="~/root.htm", aparecerá el mensaje de error cuando no se haya creado el mapa del sitio. Sin embargo, si usa StartingNodeOffset="0", entonces el mensaje de error no se muestra y simplemente no se muestra el menú cuando no se genera el mapa del sitio.

Me pareció extraño pero lo remonté al XmlSiteMapProvider. A veces se construía a veces, no. No pude meter mi cabeza completamente debajo del capó, pero parecía que algo sucedía de forma asincrónica. De todos modos, cambié al SqlSiteMapProvider de wickedcode.

Un cambio que hizo, además de convertir a vb era poner una llamada recursiva a la vuelta de la BuildSiteMap método anulado:

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

Esto hace que el mapa se basa. Pensé en poner un protector de recursión infinito pero no parece ser necesario.

Todavía estoy pensando que tal vez un retraso de red o algo de autenticación (que en nuestro lugar es a través de un controlador AD, y se retrasa a primera hora de la mañana) es lo que hace que XmlSiteMapProvider se pierda su ventana de construcción Async?

Realmente espero que esto ayude.

Cuestiones relacionadas