Come posso evitare le variabili membro statiche dall'accesso da parte di più di una richiesta in un momento in IIS?

StackOverflow https://stackoverflow.com/questions/727679

Domanda

Sto avendo qualche problema con la comprensione di come IIS sta gestendo le variabili statiche sulle sue discussioni. La mia comprensione è sempre stata che se IIS ha 4 lavoratore processi che può gestire 4 richieste contemporaneamente e che sarebbe stato lo stesso di avere 4 thread separati che gestiscono il sito web. Variabili statiche sarebbero persistere in ogni singolo filo. La ragione per cui sono un po 'confuso è che ho un ambito che ho fatto, che gestisce le connessioni e transazioni di caching. Quando sto testando l'applicazione non mi accorgo di eventuali problemi, ma dopo ho compilato e ha colpito allo stesso tempo da due luoghi diversi mi sembra di avere una sorta di conflitto. Ora, se questi processi di lavoro sono separate perché dovrebbe essere? più di una richiesta può essere elaborata su un singolo thread di lavoro allo stesso tempo? Questo è estremamente importante in quanto vi sono unici ID di che si svolgono in questi membri statici per gestire escalation degli oggetti che gestiscono queste funzioni e sembra che stanno cercando di accedere allo stesso oggetto.

Sono in esecuzione questo su server IIS di Vista su una macchina x64.

Modifica

Per i valori che hanno bisogno di persistere attraverso il filo su una singola richiesta, ho messo questi valori in Web.HttpContext.Current.Items che sembra fare il trucco.

<ThreadStatic()> può essere utilizzato, ma potrebbe non essere disponibile durante l'entirity del processo di richiesta. In un modulo che ho, viene utilizzata solo su una variabile per indicare se questo thread è già caricato le impostazioni per il server cahcing. Se fosse vero allora il battistrada (non asp.net) è pronto a recuperare i dati dal server di caching.

È stato utile?

Soluzione

In primo luogo il concetto di cambiare: se si sta utilizzando ASP.NET, sono le discussioni ASP.NET, non le discussioni IIS

.

In secondo luogo, questo è un problema NET. statiche le variabili sono condivise in tutto il AppDomain in .NET. Dal momento che avrete uno AppDomain per applicazione IIS (più o meno), questo significa che le variabili statiche saranno condivisi tra tutti i thread di lavoro nell'applicazione.

Ci sarà molto di più di quattro thread, e saranno tutti condividono le stesse variabili, il che significa che potrete sia bisogno di fare il blocco, o avrete bisogno di non utilizzare le variabili statiche.

Qualunque sia la vostra comprensione è sempre stata, vi suggerisco di andare indietro e capire dove hai preso che la comprensione da; quindi aggiornarla, perché non ha molto a che fare con ASP.NET.


EDIT:. Il soggetto è cambiato, così cambierò la risposta un po '

È necessario interbloccare l'accesso a queste variabili. In alternativa, si dovrebbe prendere in considerazione rivalutando il vostro disegno. Il vostro disegno apparentemente assunto qualche modello diverso per l'accesso alla statica. Questa ipotesi si è rivelata non essere corretta. E 'possibile che questa ipotesi potrebbe essere in cascata per tutta la progettazione. Si dovrebbe rivalutare il vostro disegno alla luce della realtà.

Altri suggerimenti

Ogni processo di lavoro viene eseguito nel proprio dominio di applicazione, in modo che ogni WP avrà la propria istanza di una variabile statica.

Nella risposta qui suggerisce il dominio di applicazione viene condivisa tra WP che non è corretto.

Si deve usare il pool di connessioni .NET e anche se si dovrebbe indagare il metodo utilizzando (IDisposable) {} di scoping le connessioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top