2010-03-16 6 views
33

Me gustaría usar netTcpBinding para mi aplicación WCF que actualmente está alojada en IIS7, lo que significa configurarla para usar WAS en su lugar. Sin embargo, esto es bastante directo, mi aplicación utilizó previamente el evento Application_Start en el archivo global.asax. No necesito acceso al httpContext (que entiendo que se eliminó el acceso en IIS7). Sin embargo, me gustaría conectarme a los métodos start o init.cuál es el equivalente global.asax Application_Start al usar WAS en IIS7

¿Existe un equivalente cuando se aloja una aplicación en WAS como apposed to IIS7?

Usar el modo clásico no es una opción (de nuevo, no estoy interesado en el httpcontext y esto solo parece funcionar si utilizo un enlace http) - y he visto un ejemplo de poner una clase estática instide la carpeta app_code que parece un truco horrible.

Respuesta

27

Creo que AppInitialize() es el método que está buscando. He aquí un artículo en usarlo para inicializar el castillo de Windsor en un servicio WCF fue organizada:

Castle Windsor and non-HTTP Protocol WCF Services

La esencia del artículo es, en lugar de utilizar Application_Start() que no se llamará en WAS:

protected void Application_Start(object sender, EventArgs e) 
{ 
    var container = new WindsorContainer("ioc.config"); 
    DefaultServiceHostFactory.RegisterContainer(container.Kernel); 
} 

uso:

public class InitialiseService 
{ 
    /// <summary> 
    /// Application initialisation method where we register our IOC container. 
    /// </summary> 
    public static void AppInitialize() 
    { 
     var container = new WindsorContainer("ioc.config"); 
     DefaultServiceHostFactory.RegisterContainer(container.Kernel); 
    } 
} 

Para citar Matt:

Confieso que pasé un tiempo buscando en la fábrica de anfitrión en más detalle, mirando para envolver el DefaultServiceHostFactory. Sin embargo, parece que es una solución mucho más simple y es utilizar el pequeño método documentado de AppInitialize. Si crea una clase (cualquier clase), colóquela en la carpeta ASP.NET App_Code en su proyecto y dele una signatura del método como se define a continuación, este pequeño bebé será despedido exactamente cuando lo desee. A continuación, puede inicializar su contenedor IoC allí.

+0

Gracias por la respuesta. Me había topado con eso, pero parece bastante "hacky" para decirlo a la ligera ... Realmente no creía que tuviera que depender de la carpeta app_code .... ¿Realmente no hay otro reemplazo adecuado? –

+0

Pero parece que está siendo ignorado por VS Web Server (también conocido como Casini, ASP.NET Dev Server) – abatishchev

+0

@abatishchev - ¿Qué pasa con IIS Express? – Kev

13

AppInitialize es un método válido para inicializar su servicio. Pero hay algunos otros métodos que pueden funcionar mejor para usted y se describen en este artículo: How to Initialize Hosted WCF Services

+0

Gracias Graham - No he tenido la oportunidad de ver esta pieza de código para validarlo, pero el artículo parece una mejor opción que tener que confiar en las otras soluciones de hacky. –

+0

Application_Start ejecuta uno para toda la aplicación. El uso de una fábrica de servicios como las menciones de enlaces se ejecutará una vez por servicio, por lo que necesitaría una lógica adicional para evitar que su código se ejecute dos veces. –

Cuestiones relacionadas