Lettura delle impostazioni di configurazione per la libreria client di archiviazione e gestione delle impostazioni modificate
Aggiornamento: maggio 2011
Se si dispone di un servizio ospitato che utilizza la libreria client della risorsa di archiviazione Windows Azure per accedere all'account di archiviazione di Windows Azure, si consiglia di archiviare la stringa di connessione nel file di configurazione del servizio. L'archiviazione della stringa di connessione nel file di configurazione del servizio consente a un servizio distribuito di rispondere alle modifiche della configurazione senza ridistribuire l'applicazione. Di seguito sono riportati esempi in cui questo approccio rappresenta un vantaggio:
-
Test. Si utilizza un account di prova mentre l'applicazione è distribuita all'ambiente di gestione temporanea ed è necessario passare all'account attivo quando si sposta l'applicazione all'ambiente di produzione.
-
Sicurezza. È necessario ruotare le chiavi per l'account di archiviazione essendo la chiave in uso compromessa.
Per ulteriori informazioni sulla configurazione della stringa di connessione, vedere Come configurare le stringhe di connessione.
Sono disponibili due modelli che è possibile implementare per gestire la modifica della configurazione:
-
Se l'applicazione può essere riavviata senza influire sul servizio, è possibile rilevare la modifica e rifiutarla, causando in tal modo il riciclo dell'istanza del ruolo dopo che gli endpoint sono stati rimossi dalla rotazione per il bilanciamento del carico. In genere, i siti Web rientrano in questa categoria. È il modo più facile e semplice per gestire la modifica.
-
Se l'applicazione è a esecuzione prolungata o non supporta il normale riavvio gestito automaticamente quando si verifica una modifica, è possibile aggiornare la configurazione del servizio ospitato mentre è in esecuzione senza mettere offline l'istanza del ruolo, eseguendo pertanto un aggiornamento a caldo della configurazione.
La libreria gestita di Windows Azure include lo Spazio dei nomi Microsoft.WindowsAzure.ServiceRuntime, che fornisce le classi per l'interazione con l'ambiente Windows Azure da codice in esecuzione in un'istanza di un ruolo. La classe RoleEnvironment definisce gli eventi in fase di modifica e modificati generati prima e dopo una modifica della configurazione. È possibile gestire questi eventi e rispondere alla modifica.
-
Aprire il file di origine contenente la classe del punto di ingresso per il ruolo, ad esempio WebRole.cs.
-
Verificare che il progetto faccia riferimento al file Microsoft.WindowsAzure.ServiceRuntime.dll e che l'istruzione using seguente venga aggiunta al file:
using Microsoft.WindowsAzure.ServiceRuntime; -
Aggiungere il codice seguente al metodo OnStart della classe del punto di ingresso del ruolo per specificare il gestore eventi:
public override bool OnStart() { RoleEnvironment.Changing += (object ignored, RoleEnvironmentChangingEventArgs e) => { var settingChanges = e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>(); foreach (var settingChange in settingChanges) { // Recycle the role when MyStorageConnectionString setting changes. // You must replace "MyStorageConnectionString" with the name of your storage // connection string as configured in your .csdef file. // If you have additional configuration settings that you want to reject // you should configure them here. if (settingChange.ConfigurationSettingName.Equals ("MyStorageConnectionString", StringComparison.InvariantCultureIgnoreCase)) { e.Cancel = true; } } }; return base.OnStart(); }
-
Salvare il file.
Prima che sia possibile rilevare modifiche della configurazione per un aggiornamento a caldo, è necessario specificare dove recuperare le informazioni di configurazione. Anziché utilizzare come predefinito un file di configurazione specifico, CloudStorageAccount richiede l'impostazione di un delegato tramite configSetter per recuperare file di configurazione corretto.
-
Aprire il file di origine contenente la classe del punto di ingresso per il ruolo, ad esempio WebRole.cs.
-
Verificare che il progetto faccia riferimento al file Microsoft.WindowsAzure.ServiceRuntime.dll e che l'istruzione using seguente venga aggiunta al file:
using Microsoft.WindowsAzure.ServiceRuntime; -
Se si utilizza un ruolo Web IIS completo o un ruolo di lavoro, aggiungere il codice seguente al metodo OnStart per specificare il gestore eventi:
public class WebRole : RoleEntryPoint { public override bool OnStart() { #region Setup CloudStorageAccount Configuration Setting Publisher // This code sets up a handler to update CloudStorageAccount instances when the // corresponding configuration settings change in the service configuration file. CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => { // Provide the configSetter with the initial value. configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); RoleEnvironment.Changed += (ignored, arg) => { if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>() .Any((change) => (change.ConfigurationSettingName == configName))) { // The corresponding configuration setting has changed, propagate the value. if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName))) { // In this case, the change to the storage account credentials in the // service configuration is significant enough that the role needs to be // recycled in order to use the latest settings. (for example, the // endpoint has changed) RoleEnvironment.RequestRecycle(); } } }; }); #endregion return base.OnStart(); } }
-
Se si utilizza un ruolo Web IIS completo, aggiungere il metodo del gestore eventi seguente al file di origine Global.asax:
void Application_Start(object sender, EventArgs e) { // Code that runs on application startup #region Setup CloudStorageAccount Configuration Setting Publisher // This code sets up a handler to update CloudStorageAccount instances when their // corresponding configuration settings change in the service configuration file. CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => { // Provide the configSetter with the initial value configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); RoleEnvironment.Changed += (ignored, arg) => { if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>() .Any((change) => (change.ConfigurationSettingName == configName))) { // The corresponding configuration setting has changed, propagate the value. if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName))) { // In this case, the change to the storage account credentials in the // service configuration is significant enough that the role needs to be // recycled in order to use the latest settings. (for example, the // endpoint has changed) RoleEnvironment.RequestRecycle(); } } }; }); #endregion }
-
Salvare il file.
Vedere anche