Aggiornarmento Web.config

martedì 21 ottobre 2008 - 09.32

volperubbia Profilo | Senior Member

Ciao a tutti,
nella mia applicazione asp.net 2.0 ho alcune coppie chiave / valore nelle appSettings. Vorrei creare una pagina di configurazione per consentire
un più facile accesso da parte di utenti installatori. Come procedere?
Pensavo ad una pagina pubblica ma protetta da password, dove presentare i valori attualmente disponibili per le varie chiavi.
Per scrivere sul web.config, come fare? Avete qualche links per poter valutare eventuali alternative?

Grazie per l'attenzione,
Davide

rossimarko Profilo | Guru

Ciao,

ti consiglio di guardare questo articolo: http://aspalliance.com/820

La cosa che devi prendere in considerazione è il fatto che di default quando modifichi il web.config viene fatto un restart del processo che sta facendo girare il sito, quindi se crei una pagina all'interno dello stesso sito la cosa ti può creare diversi problemi. Se guardi l'esempio riportano una modifica da fare al machine.config (restartOnExternalChanges) a cui però starei molto attento perchè impatta anche sulle altre applicazioni.

Io di solito queste impostazioni se sono modificabili dall'utente le salvo su db o su un file xml a parte così poi posso gestirle in autonomia.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

volperubbia Profilo | Senior Member

Ciao Marco, grazie.
Si il riavvio dell'applicazione lo mettevo già in conto, anche a livello logico le mie coppie chiave / valore servono aggiornate agli eventuali
utenti collegati. Comunque è una cosa in fase di intallazione, quindi assai rara.
Più che altro è capire se salvando il web.config potrei aver proplemi nel salvataggio in se, dopo mi può andar bene anche
il riavvio.

Ho trovato anche questo ...

<appSettings
file="relative file name" >
</appSettings>

>> Le modifiche apportate al file Web.config causano il riavvio dell'applicazione. L'utilizzo di un file separato consentirà,
>> quindi, agli utenti di modificare i valori che si trovano nella sezione appSettings senza causare il riavvio dell'applicazione.
>> Il contenuto del file separato viene unito alla sezione appSettings nel file Web.config.
>> Questa funzionalità è limitata all'attributo appSettings.

In pratica creare un mioFile.config separato per le sole AppSettings.
Che ne pensi, potrebbe essere una soluzione?

Davide

rossimarko Profilo | Guru

Dovresti fare una piccola prova.. Sicuramente in fase di lettura non avresti problemi, la cosa che devi verificare però e se il file di configurazione esterno si comporta ancora come il web.config. Non riesco a provarlo in questo momento ma se non ricordo male nel momento in cui modifichi il contenuto del file esterno non viene riavviato il processo e quindi i dati caricati rimangono quelli precedenti.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

volperubbia Profilo | Senior Member

Si non dovrebbe accorgersi delle modifiche ... faccio due prove, poi ti dico.
Ora non ricordo, per riavviare da vb l'applicazione bisogna richiamare in qualche modo Application_Start o c'è un altro modo?

Davide

rossimarko Profilo | Guru

>Si non dovrebbe accorgersi delle modifiche ... faccio due prove,
>poi ti dico.
>Ora non ricordo, per riavviare da vb l'applicazione bisogna
>richiamare in qualche modo Application_Start o c'è un altro modo?
>

No, in quel caso la cosa si fa un po' più difficile. Il metodo viene richiamato in automatico quando l'applicazione parte, non è il metodo che la fa ripartire.
Nel caso in cui usi IIS6 potresti fare un recicle dell'application pool che sta facendo girare il sito.

Se tu hai quest'esigenza allora valuterei la possibilità di salvare i dati in un file xml esterno (sfruttando la serializzazione è un'operazione abbastanza semplice http://blogs.dotnethell.it/rossimarko/Generics-e-Serializzazione__13636.aspx) e poi sfruttando il filesystemwatcher (http://msdn.microsoft.com/it-it/library/system.io.filesystemwatcher.aspx) puoi monitorare i cambiamenti al file e ricaricare i dati (http://aspadvice.com/blogs/ericm/archive/2005/08/05/2706.aspx)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

volperubbia Profilo | Senior Member

Ciao Marco, grazie.
Ho visto le cose che mi hai detto ... però mi manca l'ultimo passaggio, il riavvio. Ho fatto questo ...

Nel web.config ho messo:

<appSettings file="MioFile.config">
</appSettings>

Il file MioFile.config è un xml così fatto:

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="key 1" value="value 1" />
<add key="key 2" value="value 2" />
...........................................
</appSettings>

Fin qui tutto ok. L'applicazione funziona. Ora ho modificato il global.asax.vb per intercettare le modifiche su MioFile.config.

Public Class [Global] : Inherits System.Web.HttpApplication

Private Shared m_FileSystemWatcher As System.IO.FileSystemWatcher

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
Application.Add("watcher", New System.IO.FileSystemWatcher(Server.MapPath(String.Empty), "MioFile.config"))
m_FileSystemWatcher = DirectCast(Application("watcher"), System.IO.FileSystemWatcher)
m_FileSystemWatcher.EnableRaisingEvents = True
m_FileSystemWatcher.IncludeSubdirectories = False
AddHandler m_FileSystemWatcher.Changed, AddressOf OnChanged
End Sub

Private Shared Sub OnChanged(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)

End Sub

End Class

Sono andato in debug e, quando salvo MioFile.config, effettivamente richiama OnChanged ... ma cosa mettere dentro OnChanged per causare
il riavvio?? Ho provato con My.Settings.Reload() ... ma non ottengo nulla.

Davide

rossimarko Profilo | Guru

Se fai così io userei una classe fatta ad hoc per caricare le impostazioni, non le inserirei negli appsetting, così puoi avere il controllo completo sulla gestione.

Io farei una classe che contiene i tuoi parametri, questa classe la userai per leggere e scrivere il file xml attraverso la serializzazione.
Poi fai un'altra classe con parametri statici che valorizzerai sull'onstart e ogni volta che viene modificato il file

nell'esempio che ti riporto ho chiamato FileConfigurazione la classe da serializzare e Configurazione quella che conterrà i valori di configurazione da leggere all'interno dell'applicazione. E' un esempio scritto un po' di fretta tanto per darti un'idea su come potresti gestire la cosa. Nell'evento del file system watcher poi richiamerai il metodo che ricarica i dati (nel mio esempio è LeggiParametri)

'Classe da serializzare su file xml Public Class FileConfigurazione Private _Parametro1 As String Private _Parametro2 As String Public Property Parametro1() As String Get Return _Parametro1 End Get Set(ByVal value As String) _Parametro1 = value End Set End Property Public Property Parametro2() As String Get Return _Parametro2 End Get Set(ByVal value As String) _Parametro2 = value End Set End Property End Class Public Class Configurazione Private Shared _Parametro1 As String Private Shared _Parametro2 As String Public Shared Property Parametro1() As String Get Return _Parametro1 End Get Set(ByVal value As String) _Parametro1 = value End Set End Property Public Shared Property Parametro2() As String Get Return _Parametro2 End Get Set(ByVal value As String) _Parametro2 = value End Set End Property Public Shared Sub LeggiParametri() 'Leggere i parametri dal file xml e impostare le variabili Configurazione.Parametro1 = "valore1" Configurazione.Parametro2 = "valore2" End Sub End Class
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

volperubbia Profilo | Senior Member

Ciao Marco,
credo di aver risolto, senza il riavvio dell'applicazione e senza FileSystemWatcher.
Ho ottenuto quello che volevo, farò ancora due prove x vedere eventuali anomalie.

Riassumendo ...

Nel web.config ho messo:

<appSettings file="MioFile.config">
</appSettings>

Il file MioFile.config è un xml così fatto:

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="key 1" value="value 1" />
<add key="key 2" value="value 2" />
...........................................
</appSettings>

Dalla pagina delle configurazioni (pubblica ma protetta da password), quando salvo, vado ad aggiornare MioFile.config e, mentre scrivo le N chiavi,
chaiamo anche System.Web.Configuration.WebConfigurationManager.AppSettings(strKey) = strValue.
In questo modo, chi accede ora alle variabili appSettings, ha già l'ultimo valore. Se poi l'applicazione sarà in futuro riavviata, le chiavi saranno
automaticamente ricaricate da MioFile.config.

Davide

rossimarko Profilo | Guru


>Dalla pagina delle configurazioni (pubblica ma protetta da password),
>quando salvo, vado ad aggiornare MioFile.config e, mentre scrivo
>le N chiavi,
>chaiamo anche System.Web.Configuration.WebConfigurationManager.AppSettings(strKey)
>= strValue.
>In questo modo, chi accede ora alle variabili appSettings, ha
>già l'ultimo valore. Se poi l'applicazione sarà in futuro riavviata,
>le chiavi saranno
>automaticamente ricaricate da MioFile.config.
>

Ottimo, se non ci sono anomalie direi che sei a posto. Le due soluzioni sono pressochè analoghe, il vantaggio di sfruttare l'architettura di asp.net è che eviti di crearti le classi visto che sono già fatte, la logica è pressochè identica
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5