2010-03-16 11 views
33

Mi piacerebbe utilizzare netTcpBinding per la mia applicazione WCF attualmente ospitata in IIS7, che significa invece configurarla per utilizzare WAS. Questo è abbastanza semplice, tuttavia, la mia applicazione ha già utilizzato l'evento Application_Start nel file global.asax. Non ho bisogno di accedere a httpContext (che ho capito che l'accesso è stato rimosso in IIS7), tuttavia mi piacerebbe comunque collegarmi ai metodi start o init?qual è l'equivalente di global.asax Application_Start quando si utilizza WAS in IIS7

Esiste un equivalente quando si ospita un'applicazione in WAS come applicata a IIS7?

L'utilizzo della modalità classica non è un'opzione (di nuovo non mi interessa il httpcontext e sembra funzionare solo se si utilizza un binding http) - e ho visto un esempio di inserimento di una classe statica nella cartella app_code che sembra un orribile hack.

risposta

27

Credo che il metodo AppInitialize() sia quello che stai cercando. Ecco un articolo sul usando inizializzare Castello di Windsor in un servizio WCF è stato ospitato:

Castle Windsor and non-HTTP Protocol WCF Services

L'essenza di questo articolo è, invece di usare Application_Start(), che non andranno chiamato in WAS:

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

Usa:

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); 
    } 
} 

Per citare Matt:

Confesso ho trascorso un po 'guardando la Fabbrica Host in modo più dettagliato, cercando di avvolgere il DefaultServiceHostFactory. Tuttavia, sembra che sia una soluzione molto più semplice e che è quello di utilizzare il piccolo metodo AppInitialize documentato. Se crei una classe (qualsiasi classe), inserisci nella cartella ASP.NET App_Code nel progetto e assegnagli una firma del metodo come definito di seguito, questo piccolo bambino verrà licenziato esattamente quando lo desideri. Puoi quindi inizializzare il tuo contenitore IoC .

+0

Grazie per il responso. Mi sono imbattuto in questo, ma sembra piuttosto "hacky" per dirla alla leggera ... Non pensavo davvero che avrei dovuto fare affidamento sulla cartella app_code .... non c'è davvero altra sostituzione adatta? –

+0

Ma sembra essere ignorato da VS Web Server (aka Casini, ASP.NET Dev Server) – abatishchev

+0

@abatishchev - Che dire con IIS Express? – Kev

13

AppInitialize è un metodo valido per inizializzare il servizio. Ma ci sono altri metodi che potrebbero funzionare meglio per te e sono descritti in questo articolo: How to Initialize Hosted WCF Services

+0

Grazie Graham - Non ho avuto la possibilità di guardare questo pezzo di codice per convalidarlo, ma l'articolo sembra un'opzione migliore rispetto al dover fare affidamento sulle altre soluzioni hacky. –

+0

Application_Start ne esegue uno per l'intera applicazione. L'utilizzo di una factory di servizi come il tuo link cita verrebbe eseguito una sola volta per servizio, quindi avrai bisogno di una logica aggiuntiva per evitare che il tuo codice venga eseguito due volte. –

Problemi correlati