versione italiana versione italiana
english version english version

ASP.NET Process Model (Parte 3/3)

Per chiudere questo articolo facciamo un giro sulle impostazioni di configurazione presenti nel file Machine.Config.

 

 

Machine.Config

 

 

Il file Machine.Config è stato suddiviso in varie sezioni ognuna delle quali si occupa della configurazione di una particolare serie di settaggi. Esiste ad esempio una sezione di configurazione dell’autenticazione degli utenti (vedere articolo ASP.NET Security), una che riguarda la gestioni degli errori, un’altra la configurazione delle modalità operative di default delle varie pagine.

 

Le sezioni prese in considerazione da questo articolo sono:

 

1)      <processModel> per la configurazione del processo ASP.NET

 

2)      <httpHandler> per la configurazione degli handler di risposta

 

3)      <httpModules> per la configurazione dei vari moduli nella pipeline di esecuzione

 

 

Le ultime due sezioni, così come molte altre presenti nel file Machine.Config, vengono lette dal processo ASP.NET, mentre la sezione <processModel> viene analizzata dall’estensione isapi (unmanaged quindi) ASPNET_ISAPI. Se diamo uno squardo al flusso di esecuzione il tutto ci sembrerà più chiaro.

 

Il processo ASP.NET viene creato dall’estensione ISAPI, quindi è nel codice di quest’ultima che verrà analizzata la configurazione del processo da creare. Il controllo passa successivamente al processo esterno che a sua volta analizzerà il file Machine.Config per attivare moduli e handler http che consentono di analizzare la richiesta e fornire una risposta al client.

 

 

<processModel>

 

 

Il codice seguente è estratto direttamente dal file Machine.Config di default e contiene (commentate) tutte gli attributi e i loro possibili settaggi della sezione processModel:

 

<!--

 

processModel Attributes:

 

enable="[true|false]" - Enable processModel

 

timeout="[Infinite | HH:MM:SS] - Total life of process, once expired process is shutdown and a new process is created

 

idleTimeout="[Infinite | HH:MM:SS]" - Total idle life of process, once expired process is automatically shutdown

 

shutdownTimeout="[Infinite | HH:MM:SS]" - Time process is given to shutdown gracefully before being killed

 

requestLimit="[Infinite | number]" - Total number of requests to serve before process is shutdown

 

requestQueueLimit="[Infinite | number]" - Number of queued requests allowed before process is shutdown

 

restartQueueLimit="[Infinite | number]" - Number of requests kept in queue while process is restarting

 

memoryLimit="[number]" - Represents percentage of physical memory process is allowed to use before process is recycled

 

webGarden="[true|false]" - Determines whether a process should be affinitized with a particular CPU

 

cpuMask="[bit mask]" - Controls number of available CPUs available for ASP.NET processes (webGarden must be set to true)

 

userName="[user]" - Windows user to run the process as

 

password="[AutoGenerate | password]" - Password of windows user

 

logLevel="[All|None|Errors]" - Event types logged to the event log

 

clientConnectedCheck="[HH:MM:SS]" - Time a request is left in the queue before ASP.NET does a client connected check

 

comAuthenticationLevel="[Default|None|Connect|Call|Pkt|PktIntegrity|PktPrivacy]" - Level of authentication for DCOM security

 

comImpersonationLevel="[Default|Anonymous|Identify|Impersonate|Delegate]" - Authentication level for COM security

 

-->

 

 

Analizziamo voce per voce il significato del parametro e delle sue impostazioni

 

 

Impostazione

 

Descrizione

 

Default

 

Enable

 

Abilita/Disabilita la sezione processModel

 

true

 

Timeout

 

In minuti. Specifica il timeout dopo il quale viene ucciso il processo corrente e creato un nuovo processo. Se vogliamo può essere considerato il tempo di vita di ogni processo ASP.NET

 

Infinite

 

idleTimeout

 

In minuti. Specifica il numero di minuti di inattività del processo trascorsi i quali il processo viene

 

Infinite

 

shutdownTimeout

 

In hh:mm:ss. Tempo di shutdown consentito prima del kill. Allo scadere di un timeout il processo ha questo tempo per eseguire lo shutdown: allo scadere di questo tempo il processo viene “ucciso”.

 

0:

 

requestLimit

 

Numero delle richieste dopo le quali viene creato un nuovo processo ASP.NET per rispondere alle richieste successive.

 

Infinite

 

requestQueueLimit

 

Numero massimo di richieste accodabili. Superato questo limite viene creato un nuovo worker process su cui vengono redirette le richieste in coda

 

5000

 

restartQueueLimit

 

Numero delle richieste tenute in coda mentre il processo viene fatto ripartire

 

10

 

memoryLimit

 

% sulla memoria totale. Superato tale limite viene creato un nuovo worker process a cui vengono riassegnate le richieste in coda.

 

40/60 a seconda della versione

 

webGarden

 

Un sistema multiprocessore è chiamato Web Garden. True (minuscolo) indica che il sistema userà i processori disponibili. False (minuscolo) indica che verrà utilizzato il parametro cpuMask per specificare quali CPU verranno utilizzare per fare girare il processo ASP.NET.

 

true

 

cpuMask

 

Bitmask che indica quali CPU (webGarden deve essere false) verranno utilizzate per il processo ASP.NET. Ad esempio con 4 CPU un valore di 0111 indica che non verrà utilizzato il terzo processore per l’esecuzione del processo.

 

0xffffffff

 

userName

 

Account con il quale girerà il processo ASP.NET. Vedere gli articoli ASP.NET Security

 

ASPNET

 

Account creato dall’installazione di ASP.NET

 

password

 

Password per l’account con il quale girerà il processo ASP.NET.

 

AutoGenerate

 

logLevel

 

Tipo di logging.

 

All: Tutti gli eventi vengono loggati nell’EventLog

 

None: Nessun evento viene loggato

 

Errors: Solo gli errori vengono loggati (Shutdown, deadlock, etc)

 

Errors

 

clientConnectedCheck

 

Hh:mm:ss. Tempo in cui una richiesta viene tenuta in coda prima di effettuare il controllo sulla connessione del client. Il controllo verifica che il client sia ancora connesso

 

0:00:05

 

comAuthenticationLevel

 

Livello di autenticazione COM. Gli attributi sono: Default,Connect, None, Call, Pkt, PktIntegriti e PktPrivacy. Corrispondono agli attributi COM+ classici. Pkt sta per Packet

 

Connect

 

comImpersonationLevel

 

Default, Anonymous, Identify, Impersonate e Delegate. Corrispondono agli attribute COM+

 

Impersonate

 

 

 

<httpHandler>

 

 

Come abbiamo descritto in precedenza, la sezione <httpHandlers> consente di mappare le richieste Http entranti con gli appropriati Handler (classi che implementano IHttpHandler o IHttpHandlerFactory).

 

Per la descrizione, anche in questo caso, diamo uno sguardo ad un estratto del file Machine.Config: (Seguiranno articoli specifici sulla creazione di HttpHandler e HttpModules)

 

 

<httpHandlers>

 

<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

 

…..

 

</httpHandlers>

 

 

In questa voce vediamo come, a fronte di una richiesta per una estensione “.aspx” per qualunque tipo di richiesta http, il proceso ASP.NET debba invocare la classe System.Web.UI.PageHandlerFactory presente nell’assembly System.Web.

 

Il PageHandlerFacroty, come ci suggerisce il nome, è la classe che si incarica di gestire richiesta/risposta Http sotto forma di pagine Web.

 

Visto che System.Web è un assembly condiviso viene indicato il cosiddetto “strong name” composto da Versione, Culture e PublicKeyToken. (Per ulteriori informazioni sugli assembly vedere l’articolo di Marco “Cos’è un Assembly” e “Assembly: Versioning & Deployment”)

 

 

Nell’estratto seguente si nota come all’estensione “.asmx” venga associato l’handler che gestisce i Web Services, mentre all’estensione “.soap” venga associato l’handler che gestisce Remoting.

 

 

<add verb="*" path="*.asmx" type="System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>

 

<add verb="*" path="*.soap" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>

 

 

Per ulteriori informazioni sui web services vedere gli articoli di Paolo nell’apposita sezione del sito www.DevLeap.it.

 

 

I verbi Http corrispondono ai classici GET, PUT, POST, ecc.

 

Nell’attributo “path” si possono usare URL completi oppure *.estensione.

 

Nell’attributo “type” deve essere indicato lo strong name dell’assembly condiviso o semplicemente il nome dell’assembly per tutti gli assembly privati (dell’applicazione).

 

 

Per terminare la descrizione allego un’altro estratto del file Machine.Config in cui si nota la gestione della risposta per gli url non accessibili. In questo caso infatti, a fronte di una richiesta per un file con estensione “.asax” interviene l’handler HttpForbiddenHandler il cui nome ci suggerisce la risposta che verrà inviata al client. Provare per credere.

 

 

<add verb="*" path="*.asax" type="System.Web.HttpForbiddenHandler, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

 

 

I tag consentiti sono <add> per aggiungere un’impostazione, <remove> per rimuovere un’impostazione precedentemente indicata (deve corrispondere al tag add precedente nell’impostazione di verb/path) e <clear> per rimuovere tutte le impostazioni configurati o ereditati in precedenza.

 

 

Come abbiamo accennato e come vedremo in un articolo dedicato per aggiungere un proprio Handler che risponda all’estensione “.Pippo” invocando l’assemby DevLeap.Pippo è sufficiente aggiungere un elemento <add> al file di configurazione:

 

 

<add verb=”*” path=”*.Pippo” type=”DevLeap.Pippo, DevLeap”>

 

 

Dove DevLeap.Pippo è la classe nell’assembly DevLeap (privato in questo caso).

 

 

<httpModules>

 

 

L’ultima sezione che ci resta da analizzare è <httpModules> che viene configurata in modo simile alla sezione <httpHandlers> appena analizzata. Anche a questa sezione verrà dedicato un articolo separato in cui vedere come costruirsi un proprio HttpModule.

 

 

Nel seguente estratto del file Machine.Config si nota come la gestione del caching, delle Session e dell’autenticazione Windows sia configurata come modulo http, che ricordiamo interviene nella pipeline di esecuzione durante il processo di richiesta/risposta.

 

In questo caso tutte le richieste attrversano il modulo OutputCache, il modulo SessionStateModule e WindowsAuthenticationModule. Questi moduli sono classi dell’assembly condiviso System.Web come si vede dallo strong name indicato, dopo il nome della classe, nel paramentro type.

 

 

        <httpModules>

 

            <add name="OutputCache" type="System.Web.Caching.OutputCacheModule, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

 

            <add name="Session" type="System.Web.SessionState.SessionStateModule, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

 

            <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

 

        </httpModules>

 

 

 

Ogni applicazione ASP.NET (Directory, Virtual Directory o Virtual Site in IIS) può contenere un file di configurazione (Web.Config) che ridefinisca o aggiunga elementi di configurazione proprietari dell’applicazione stessa rispetto alle impostazioni generali del file Machine.Config. E’ sufficiente inserire un tag XML non presente nel file machine.config per aggiungere un elemento oppure inserire un tag XML già presente nel file machine.config per fare l’override dell’impostazione settata nel machine.config.

 

Quindi ogni applicazione può aggiungere o rimuovere HttpHandler e/o HttpModule per personalizzare i meccinismo di funzionamento della stessa rispetto alle altre applicazioni ospitate sullo stesso server Web.

 

E’ ovvio che le impostazioni sul processo ASP.NET, cioè la sezione <processModel> non possa essere ridefinita nel file Web.Config di ogni applicazione visto che l’impostazione riguarda il meccanismo di funzionamento del worker process esterno. Ricordiamoci anche che quest’ultima sezione non viene letta dal worker process, ma dall’estensione unmanaged ASPNET_ISAPI prima che il controllo passi al processo ASP.NET.