Pregunta

En mi Global.asax presentar Application_Start Creo un cierto número de rutas en RouteTable.Routes recorriendo una lista de páginas web recopiladas de una base de datos. Esto funciona bien, todas las rutas se crean y funcionan según sea necesario. Pero en mi aplicación web, el usuario puede modificar la base de datos y, por lo tanto, la recopilación de páginas web. Esto significa que durante el ciclo de vida de la aplicación, algunas de las rutas se vuelven inválidas, y se deben agregar nuevas rutas.

Lo que deseo hacer es: en el momento en que el usuario cambia algo a la colección de páginas web, me gustaría borrar el enrutable y volver a cargarlo en la colección de páginas web (modificadas).

Desafortunadamente, el Application_Start en Global.asax se ejecuta solo una vez, a saber, al comienzo de la aplicación. Intenté moverlo a Session_Start que resulta en un comportamiento no deseado debido a la RoutesTable siendo estático.

¿Cómo le doy a mi usuario la capacidad de cambiar la colección de la página web sobre la marcha mientras tiene la estática? RouteTable permanecer 'en sincronización' con eso?

Editar

Por el momento hago algo como esto (pseudo-código):

public class WebPageInfo      // represents a record in the database
{
 public string Title;         //  My nice page
 public string Url;           //  NicePage 
 public string PhysicalFile;  //  ~/Page.aspx
}

En global.asax:

protected virtual void Application_Start(object sender, EventArgs e)
{
 foreach (WebPageInfo webPageInfo in webPageInfos)
 {
  RouteTable.RegisterRoute(webPageInfo.Title, webPageInfo.Url, webPageInfo.PhysicalFile);
 }
}

El problema es que durante el ciclo de vida de la aplicación, los usuarios pueden agregar/modificar/eliminar registros en el webPageInfos, ¿Cómo actualizo el Routetable con estos cambios?

¿Fue útil?

Solución

La respuesta de usbsnowcrash se dirige en la dirección correcta. Ya sabes cómo cargar el RouteTable información, por lo tanto, en lugar de hornear ese código directamente en el Application_Start método, póngalo en un método separado que se pueda llamar, tal vez algo como RegisterRoutes. los Application_Start el método llamaría RegisterRoutes Para realizar la carga inicial. En el código que escribe los cambios en la colección de páginas, después de que se hayan cometido las actualizaciones, llame RegisterRoutes Para recargar el enrutable.

Querrá incluir algunas llamadas de seguridad de hilo como RouteTable.Routes.GetWriteLock() y también querrá borrar las rutas antes de recargar todo desde la fuente de datos (como se menciona por usbsnowcrash).

He visto esta técnica utilizada con una clase de "bootstrapper" que proporciona una static (Shared en vb) método que se puede invocar según sea necesario. El truco es convertirlo en un método separado del Application_Start Método para que pueda ejecutar el código sin confiar únicamente en el ciclo de vida de la aplicación. Asegúrese de incluir las llamadas de "compensación" para que las cosas comiencen desde cero cada vez que se invoca el método.

Otros consejos

Rutetable se puede reemplazar. Lo que haría es tener algún evento de votación que verifique el DB cada 10 minutos más o menos y, si detecta un cambio, reemplace la tabla de enrutamiento (asegúrese de hacer este código SHIRESFE). Así es como podría verse el código para hacer la actualización (suponiendo que AddAllRuleets es una función que escribe para agregar todos los conjuntos de reglas del DB).

        'somewhat threadsafe
        With System.Web.Routing.RouteTable.Routes
            Using .GetWriteLock()
                routes.Clear()
                'readd routes from your db
                AddAllRulesets()
            End Using
        End With
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top