Nello script #201 si è visto come, data la natura remota delle applicazioni Windows Azure, in sostituzione del web/app.config si possa usare il file cscfg e la classe RoleEnvironment per caricare informazioni da un file di configurazione, facilmente modificabile dal portale Azure.
Quando si modifica questo file attraverso l'edit inplace o l'upload di un nuovo file, non vi è alcun meccanismo automatico per l'applicazione delle modifiche. Nelle applicazioni ASP.NET si è abituati che ogni modifica al web.config comporta il reciclo dell'intera applicazione, mentre in applicazioni Windows occorre implementare un proprio meccanismo per reagire ai cambiamenti, strada spesso difficile da percorrere.
In Windows Azure invece la classe RoleEnvironment espone due eventi: Changing e Changed. Il primo notifica dei cambiamenti che devono essere applicati, il secondo che sono stati applicati. Per cambiamenti si intendono sia modifiche alla configurazioni dei ruoli (numero di istanze), sia modifiche ai settings. Quando con Visual Studio 2010 si crea un progetto Windows Azure è possibile già trovare l'intercettazione del primo evento Changing all'interno del RoleEntryPoint:
private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) { // If a configuration setting is changing if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) { // Set e.Cancel to true to restart this role instance e.Cancel = true; } }
Prima di tutto il codice controlla all'interno della proprietà Changes, che restituisce una lista di tipi RoleEnvironmentConfigurationSettingChange e RoleEnvironmentTopologyChange, se ci sono cambiamenti nei settings. Impostando a true la proprietà Cancel ottiene così il riciclo dell'applicazione, con conseguente evento di stop e riavvio. Normalmente non avviene nessun riciclo, salvo che la topologia e in particolare l'istanza venga rimossa.
Se l'evento Changing permette di conoscere i cambiamenti, Changed permette di applicarli. Da migliore continuità di servizio infatti non riciclare l'applicazione, ma reagire ai cambiamenti per le successive operazioni. In questo caso è compito dello sviluppatore avere delle classi che permettano di cambiare le loro proprietà di funzionamento. Ad esempio la classe CloudStorageAccount, vista nello script #203, mette a disposizione il delegate configSetter per applicare le modifiche ed è possibile chiamarlo anche con l'evento Changed. La documentazione infatti consiglia sempre il seguente snippet:
CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => { // Imposto le configurazioni configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); // Intercetto i cambiamenti RoleEnvironment.Changed += (sender, arg) => { // Se è cambiato un settings con un nome utilizzato dal CloudStorageAccount if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>() .Any((change) => (change.ConfigurationSettingName == configName))) { // Applico le modifiche if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName))) { // Riciclo se non va a buon fine RoleEnvironment.RequestRecycle(); } } }; });
Il codice ben documentato mostra come intercettare i cambiamenti e applicarli. Nel caso ciò non avvenga, per logiche interne, viene richiesto con il metodo statico RequestRecycle di riavviare l'applicazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare agenti facilmente con Azure AI Agent Service
.NET Conference Italia 2024
Utilizzare DeepSeek R1 con Azure AI
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Utilizzare Azure AI Studio per testare i modelli AI
Migliorare l'organizzazione delle risorse con Azure Policy
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Supportare la sessione affinity di Azure App Service con Application Gateway
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Gestire gli accessi con Token su Azure Container Registry
I più letti di oggi
- #IE10 disponibile al download da subito: http://aspitalia.com/vf http://aspitalia.com/mix-11 #mix11
- #ie10 supporta il multitouch anche in #Javascript. http://aspitalia.com/build-win8 #BldWin
- stiamo per partire con #aspilive .NET Serverless Day, con @dbochicchio, @cristiancivera e @kasukenhttps://aspit.co/ServerlessDay #azure #aws #serverless #dotnet
- vuoi costruire applicazioni web in real time? non perdere il nostro speciale! https://aspit.co/aln #signalr #websockets #polling #aspnet
- finiamo con @itsonlyGianca e #Windows10 iot core e #raspberrypi2 con #VS2015 su #aspilive: https://aspit.co/VS2015-live
- #Windows10 #iot core è ora disponibile al download per #RaspberryPI2 e #MinnowBoardMAX: https://aspit.co/a6a