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 |
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 |
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.
