¿Cómo recargar el enrutable cuando ha cambiado la colección de páginas web?
-
29-10-2019 - |
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?
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