2011-09-12 13 views
16

Vogliamo riscaldare un'applicazione ASP.NET MVC ospitata sul server IIS 7.5. Il modulo di riscaldamento che era disponibile a http://forums.iis.net/t/1176740.aspx è stato rimosso da qualche tempo.Come scaldare un'applicazione ASP.NET MVC su IIS 7.5?

L'applicazione deve essere sottoposta a riscaldamento ogni volta che IIS o il processo di lavoro ASP.NET si riavvia per qualsiasi motivo. Durante il periodo di riscaldamento, IIS dovrebbe restituire qualche codice di stato HTTP che indica il suo stato di riscaldamento o la sua incapacità di servire qualsiasi client.

Sarebbe una buona idea creare un file eseguibile che naviga attraverso le pagine necessarie nel sito tramite HttpRequests? L'eseguibile può essere attivato dall'implementazione di IProcessHostPreloadClient. È possibile configurare IIS in modo che accetti solo le richieste da localhost e una volta eseguito l'eseguibile, può passare a tutti i client, ma tale opzione non dovrebbe attivare un riavvio di IIS (ovviamente).

È possibile utilizzare Visual Studio 2010 - Web Performance Test per riscaldare un'applicazione anziché creare un eseguibile manuale? Qualche altra alternativa?

PS: l'applicazione utilizza l'autenticazione basata su moduli e utilizza le sessioni, pertanto è importante mantenere il cookie di stato e altri cookie.

AGGIORNAMENTO 1 - Stiamo utilizzando .NET Framework 4.0 e Entity Framework (primo database) nella nostra applicazione. Le prime volte che le risposte alle richieste EF sono lente. La ragione per cui il warm up è quello di ottenere questi primi successi. Utilizziamo già query compilate nella maggior parte dei casi e abbiamo implementato visualizzazioni precompilate per EF. La dimensione del modello e dell'applicazione è molto grande e complessa. Il warm up deve attraversare molte pagine per garantire che le query EF compilate e non compilate vengano eseguite almeno una volta prima che qualsiasi utente finale acceda all'applicazione.

+0

Correlati: http://stackoverflow.com/questions/13250679/how-to-warm-up-up-entity-framework-when-does-it-get-cold –

+0

Prova a controllare [la mia soluzione] (http: // stackoverflow.com/questions/15348621/iis-7-5-application-initialization-for-asp-net-web-service-warmup-without-rema/15367638?noredirect=1#comment33723748_15367638). Non restituirà uno speciale codice di stato, ma attenderà invece il riscaldamento per rispondere alle richieste. – Jason

risposta

9

È possibile dare un'occhiata allo following post per la funzione di avvio automatico integrata in IIS 7.5 e ASP.NET 4.0.

+0

Grazie per esserti interessato a questo. Si prega di controllare "UPDATE 1" nella query originale che offre più contesto al problema. L'utilizzo del metodo specificato nel blog di ScottGu potrebbe non aiutare a soddisfare tutti i requisiti che abbiamo. Abbiamo bisogno di avere il sito dal vivo - ma non accessibile a tutti finché non viene riscaldato. Dobbiamo attraversare le nostre pagine prima di consentirne l'accesso a tutti. –

+0

@Dhwanil Shah, il riscaldamento si verifica quando IIS viene avviato, vale a dire dopo il riavvio del server e molto prima che la prima richiesta abbia mai avuto il tempo di colpire l'applicazione. –

+0

Sarei in grado di accedere alle pagine del mio sito dal codice all'interno di un'implementazione di IProcessHostPreloadClient? –

4

Qualsiasi applicazione che generi una richiesta server per le risorse ospitate può essere utilizzata per scaldare un processo IIS. Esattamente quante richieste hai bisogno dipende da quali parti devono essere riscaldate. In genere, il riscaldamento viene utilizzato per:

  • Avvio di un processo di lavoro. Per questo, devi solo chiedere una risorsa per scaldare un processo per l'intera applicazione.
  • Eseguire qualsiasi inizializzazione statica, avvio del database o pre-cache. Qualsiasi cosa tu faccia nel tuo file Global.asax avverrà quando effettui la tua prima richiesta, quindi se puoi fare in modo che tutta la tua inizializzazione avvenga, allora devi solo fare una richiesta di pagina.
  • Forza la precompilazione di pagine ASP.NET. Perché ciò accada, dovrai colpire ogni pagina. Fortunatamente, questo in genere non costa molto tempo, quindi probabilmente non devi preoccuparti di questo. Se hai pagine singole che si caricano lentamente, puoi riscaldarle separatamente.

Il processo di "riscaldamento" qui non è niente di magico. Hai solo bisogno di forzare IIS a servire l'URL in questione. Tutto quello che hai citato si sarebbe occupato di questo: usare uno strumento di stress test per interrogare l'URL, scrivere un'utility personalizzata per postare richieste HTTP, anche solo scriptare uno strumento come "wget" o uno script PowerShell per scaricare gli URL lo farebbe .

Per quanto riguarda la limitazione dell'accesso a localhost, per quanto ne so, all'interno di IIS, l'unico modo per cambiare che richiede il riavvio di IIS. È sempre possibile creare un hook di pre-richiesta nell'applicazione e mantenerne lo stato e fare in modo che il processo di riscaldamento esegua una query su un URL specifico che commuta tale stato su "open".Ma non sono sicuro di ciò che realizzeresti. Se, in qualche modo, un utente ha provato a interrogare il tuo sito prima del completamento del riscaldamento, tutto ciò che accadrà è che il tuo sito impiegherà molto tempo per rispondere, quindi alla fine otterrà la pagina richiesta. Se li avessi bloccati fuori dal sito durante il riscaldamento, avrebbero invece ricevuto un errore di rete del browser che affermava che il sito era offline, il che (per me) suona molto peggio.

+3

È possibile precompilare le pagine prima della distribuzione (durante il processo di compilazione), che ha un ulteriore vantaggio di trovare bug che non vengono rilevati durante la compilazione C#/VB.NET. –

+0

@ Michael - Grazie per esserti interessato a questo. Si prega di controllare "AGGIORNAMENTO 1" per ottenere più contesto sulla query. –

+0

@Jakub - Stiamo usando la pre-compilazione di ASP.NET. –

9

Microsoft ha rilasciato un modulo che fa esattamente quello che chiedi. Lo Application Initialization Module for IIS 7.5 migliora la reattività dei siti Web caricando le applicazioni Web prima che arrivi la prima richiesta.

È possibile specificare una serie di URL che IIS precaricherà prima di accettare richieste da utenti reali. Non penso che tu possa ottenere un vero account di accesso utente, ma forse puoi configurare pagine simulate che non richiedono login che soddisfano lo stesso riscaldamento che chiedi?

La funzione che ritengo più interessante è che questo modulo consente anche il riciclo dei processi sovrapposti. Lo following tutorial from IIS 8.0 include un approccio passo-passo su come abilitare il riciclo dei processi sovrapposti.

Quando IIS rileva che un processo di lavoro attivo viene riciclato, IIS non attiva il traffico attivo sul nuovo processo di lavoro riciclato fino a quando il nuovo processo di lavoro termina l'esecuzione di tutti gli URL di inizializzazione dell'applicazione nel nuovo processo. Ciò garantisce che i clienti che navigano nel tuo sito Web non visualizzino le pagine di inizializzazione dell'applicazione quando un'applicazione è attiva e in esecuzione.

Questo modulo di inizializzazione dell'applicazione IIS è incorporato in IIS 8.0, ma è available for download for IIS 7.5.

Problemi correlati