Ottenere ApplicationState in asp.net senza HttpContext
-
21-08-2019 - |
Domanda
Ho una webapp che memorizza un oggetto config nella ApplicationState. Questo oggetto contiene la stringa di connessione al database tra le altre cose.
A volte comincio un filo async per fare un paio di più attività in esecuzione, come l'invio di e-mail e l'aggiornamento del database.
Tuttavia, poiché questa discussione non hanno un HttpContext non riesco a ottenere l'oggetto di configurazione.
So che questo disegno che tutto dipende HttpContext è male, ma questo è troppo tardi per cambiare la società. Guardando riflettore vedo che la classe HttpContext solo utilizza una classe interna statica per ottenere l'ApplicationState. C'è un altro modo per ottenere a questo?
Tutte le classi interne in .net sono davvero fastidioso.
Soluzione
Basta passare quello che vuoi al tuo thread quando lo si avvia. Utilizzare un ParameterizedThreadStart delegato per avviarlo invece di un ThreadStart delegato. Si potrebbe o passare HttpContext.Current, oppure raggruppare insieme le informazioni che desidera che il thread per avere, e passarlo.
Altri suggerimenti
Se davvero hanno bisogno di accesso a Applicazione Stato (o simili) da gestori asincroni si dovrebbe modificare la HttpApplication
sottoclasse (ad es Global.asax) per memorizzare l'istanza di applicazione di Stato (this.Application
) a una proprietà statica durante Application_Start
:
public static HttpApplicationStateWrapper State { get; private set; }
protected void Application_Start()
{
State = new HttpApplicationStateWrapper(this.Application);
}
Sarebbe più opportuno utilizzare un quadro DI registrare questo caso, ma se ne avete uno a disposizione si potrebbe forse evitare l'uso di Application Stato del tutto per la memorizzazione di configurazione. Inoltre, v'è un framework di configurazione in .NET che si rivolge direttamente a questa esigenza e offre la possibilità di leggere la configurazione da qualsiasi luogo.