2012-02-28 11 views
7

He leído que para que umbraco ejecute mi código al inicio de la aplicación, necesito heredar de umbraco.Global y anular Application_Start. Lo he hecho con el siguiente código simple que reside en su propio ensamblado al que hace referencia el proyecto del sitio web de umbraco, y en su carpeta bin.código de inicio de aplicación personalizado para el sitio web de umbraco

public class AtomicF1Global : umbraco.Global 
{   
    protected override void Application_Start(object sender, EventArgs e) 
    { 
     base.Application_Start(sender, e); 

     new WindsorStarter().Start(); 

     throw new Exception("Reached Custom Global"); 
    } 
} 

La excepción está allí simplemente para demostrarme que no fue llamado.

Por lo que sé, todo lo que tengo que hacer es lo que he hecho. No necesito actualizar una tabla de umbraco en ningún lugar (como es el caso cuando realizo varias modificaciones a umbraco).

Sin embargo, nunca se ha llamado a mi código y no he podido averiguar por qué. ¿Debo registrar algo en alguna parte?

También he comprobado que "App_Global.asax.dll" no está presente en el directorio bin.

también he intentado crear un Global.asax en el proyecto de sitio umbraco que tiene este aspecto:

<%@ Application Language="C#" Inherits="umbraco.Global" %> 
<%@ Import Namespace="atomicf1.domain" %> 

<script runat="server"> 

    void Application_Start(object sender, EventArgs e) 
    { 
     // Call Global base class first 
     base.Application_Start(sender, e); 


     // Code that runs on application startup 
     new WindsorStarter().Start(); 

     throw new Exception("Reached Custom Global"); 

    }    
</script> 

versión de umbraco es 4.7.1 (.NET 4.0).

+0

¿Encontró una solución para esto? – Digbyswift

+0

Desafortunadamente, no –

Respuesta

0

Si desea que el código se ejecute al iniciar la aplicación, la forma en que normalmente lo haría es crear una clase que herede de ApplicationBase. Las clases públicas que heredan de esto se llaman cuando se inicia la aplicación Umbraco. Aquí hay un código de ejemplo de uno de los eventos de inicio que utilizamos en uno de nuestros sitios Umbraco:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using umbraco.BusinessLogic; 
using umbraco.cms.businesslogic.web; 
using umbraco.BasePages; 

namespace MySite.Events 
{ 
    public class EventHandlers : ApplicationBase 
    { 
     public EventHandlers() 
     { 
      //put your code to run on app startup here 
     } 
    } 
} 
+2

Lo he marcado porque esta no es la forma correcta de agregar código para ejecutar en el arranque. Así es como extendería los eventos de Umbraco, p. Mover o copiar un nodo. Si agrega el registro a esto, verá que esto en realidad podría ser instanciado varias veces dentro de la vida útil de una aplicación. – Digbyswift

+1

FWIW He intentado este método también, después de leerlo en una publicación de blog de Matt Brailsford. –

+0

@Digbyswift Pero si necesita ejecutar cosas que dependen del núcleo de umbraco, puede usar esto. Ejecutarlo en Application_Start no le daría acceso a los nodos en el documento xml almacenado en caché. Este es un buen método para sitios antes de la introducción de IApplicationStartupHandler –

2

implementar su propio Global.asax es la forma correcta, ya que se ejecutará al iniciar la aplicación.

He implementado mi global.asax de forma similar a la suya, sin embargo coloco el código en un archivo separado de CS en un proyecto separado, pero eso es solo mi camino.

public class Global : umbraco.Global 
{ 
    protected override void Application_Start(object sender, System.EventArgs e) 
    { 
     base.Application_Start(sender, e); 

     XmlConfigurator.Configure(); 
     ILog log = LogManager.GetLogger(typeof (Global)); 
     log.Debug("Application started"); 
    } 

} 

En cuanto a las diferencias, lo que tendría que añadir protected override a su método.

Personalmente, siempre agrego el registro (usando log4net) a mi archivo global.cs para poder asegurarme de que mi registro está funcionando y que la aplicación se ha reiniciado.

Si no se recoge el código, intente modificar el archivo web.config para forzar el reinicio de la aplicación, pero también realice un paso con el depurador para asegurarse de que su código no se está alcanzando para algunos otra razon.

+0

Gracias. Estoy usando exactamente tu método en mi clase AtomicF1Global, pero simplemente no me despiden. Intenté tocar la web.config y reiniciar el grupo de aplicaciones, etc. No tengo idea de por qué, porque todo lo que he leído apunta a lo que inicialmente probé (y también a tu solución) como el camino a seguir. –

1

Yo usaría el paquete WebActivator. Luego puede hacer que su código se ejecute sin molestarse con global.asax y anulando los métodos de Umbraco.

Consulte this blog post by Bart Wullems para un comienzo rápido.

+0

ese enlace de WebActivator ha desaparecido. Creo que se encuentra aquí ahora https://www.nuget.org/packages/WebActivatorEx/ – Sharky

4

Creé una solución MVC vacía en Visual Studio y agregué Umbraco 6.x. Editó global.asax.cs y tuvo el mismo problema que tú: la función no se activa.

La solución parece fácil, pero un poco complicado:

En el archivo Global.asax (si hace doble clic en él, Visual Studio abre Global.asax.cs, presione "F7" o haga clic con el botón derecho en global.asax y seleccione "Ver Marcado") debe cambiar el atributo "Heredar". Ver global.asax original del umbraco:

<% Application Codebehind="Global.asax.cs" Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %> 

Cambio a esto:

<%@ Application Codebehind="Global.asax.cs" Inherits="YourGlobalClassName" Language="C#" %> 

Nota: si YourGlobalClassName está dentro de un espacio de nombres, asegúrese de incluir el espacio de nombres, así, como este:

<%@ Application Codebehind="Global.asax.cs" Inherits="YourNameSpace.YourGlobalClassName" Language="C#" %> 

Consulte también:

original custom controller documentation de umbraco.

Pregunta similar (dirigida a umbraco 6): solution in stackoverflow.

1

Aprecio que esta es una pregunta muy antigua, pero esta es una de las pocas opciones que encontré al buscar en un problema similar.

La solución que he establecido difiere de las mencionadas en este hilo, así que pensé que también la ofrecería.

Seguí adelante y escribí un CustomWebModule que se puede ubicar entre la solicitud web y las solicitudes entrantes en umbraco.

El primer paso fue escribir una costumbre IHttpModule aplicación

namespace My.Application.Namespace 
{ 
    public class CustomWebModule : IHttpModule 
    { 
     static void AuthenticateRequest(object sender, EventArgs e){ 
      // DO ALL FANCY STUFF in my app and then make calls to the 
      // KEY umbraco functions from umbraco.core.security.AuthenticationExtensions 
      // "AuthenticateCurrentRequest" function. 
      // 
      // specifically: setting the GenericPrincipal and related entities. 
     } 

     public void Dispose() 
     { 
      //throw new NotImplementedException(); 
      // make sure you don't write a memory leak! 
      // dispose of everything that needs it! 
     } 

     public void Init(HttpApplication app) 
     { 
      app.AuthenticateRequest += AuthenticateRequest; 
     } 
    } 
} 

nota de que las llamadas requeridas en la sección "virguerías" se enumeran en la base de código central Umbraco aquí:

https://github.com/umbraco/Umbraco-CMS/blob/dev-v7/src/Umbraco.Core/Security/AuthenticationExtensions.cs

luego agregue claves a la web.config

<system.web> 
    <httpModules> 
     <add name="CustomWebModule" type="My.Application.Namespace.CustomWebModule"/> 

y

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
      <remove name="CustomWebModule"/> 
      <add name="CustomWebModule" type="My.Application.Namespace.CustomWebModule"/> 
+1

Un poco duro, pero me gusta – Sharky

Cuestiones relacionadas