2016-06-10 21 views
5

Quando una richiesta HTTP viene ricevuta da IIS, invia la richiesta all'applicazione richiesta in un pool di applicazioni gestito da uno o più processi di lavoro. Un processo di lavoro genera un thread dal pool di thread condiviso (se necessario) per soddisfare la richiesta http.Web Api Controller e pool di thread

(i) Nel contesto di un controller web api, quando viene ricevuta questa richiesta, il controller è istanziato e assegnato al thread generato?

(ii) Quando ci sono più richieste HTTP sullo stesso controller API, ci saranno tante istanze del controller per thread generato?

(iii) In uno scenario in cui una risorsa non thread-safe (dbContext) viene dichiarata a livello di classe e creata un'istanza in un costruttore e quindi utilizzata nei metodi di classe. Ci saranno problemi nell'impegno e nella gestione delle transazioni?

In sostanza, esiste una corrispondenza one-to-one dell'istanza controller per thread? (Sono consapevole che con asp.net più thread possono effettivamente servire una singola richiesta http).

risposta

3

(i) Nel contesto di un controller api web, quando la richiesta è ricevuta , è il controllore un'istanza e assegnato al generato filo? (ii) Quando ci sono più richieste HTTP sullo stesso controller API, ci saranno tante istanze del controller per thread generato?

Quando viene ricevuta una richiesta, un'istanza del controllore viene creata da ControllerFactory o DependencyResolver.

Fondamentalmente, il thread principale crea un'istanza di controller e quindi la stessa istanza viene condivisa tra più thread fino al completamento della richiesta.

(iii) In uno scenario in cui una risorsa che non è thread-safe (DbContext) è dichiarato a livello di classe e un'istanza in un costruttore e poi utilizzato nei metodi della classe. Ci saranno problemi che impegnano e gestiscono le transazioni?

Sì, condividi membro o statico non sono thread-safe. Tuttavia, le variabili locali all'interno dei metodi di azione sono thread-safe.

+0

Quindi ha senso istanziare un dbcontext all'interno dei metodi di azione e riutilizzarli con più istanze di repository diversi tutti nell'ambito del metodo di azione. Ho già provato questo e funziona :). Ma sono preoccupato per gli odori di codice ... –

1

Rispondere alle domande per punto:
(i). Sì
(ii). No. Normalmente i controller sono singleton e non thread-safe. È possibile creare più thread per gestire più richieste ma eseguono la stessa istanza (o servizio) del controller
(iii). Sì. È vostra responsabilità occuparsi dei controlli di integrità dei dati o presentare problemi di sicurezza. Se non lo fai, puoi affrontare tutti i tipi di problemi come la lettura sporca, la corsa sporca, la sicurezza dei thread ... tutti i tipi di problemi relativi alla sicurezza dei thread.

È possibile considerare il controller come servizio in modo da delegare solo le richieste in arrivo a nuovi sotto-servizi o controller creando una nuova istanza come la creazione di un nuovo gestore di attività per ogni richiesta, ma è ancora necessario pensare alla sicurezza dei thread delle risorse condivise come Database .

+0

sei sicuro della tua risposta di (ii)? in questa pagina https://docs.microsoft.it/it/us/aspnet/web-api/overview/advanced/dependency-injection it: "I controllori sono creati per richiesta." ma forse ti fraintendiamo – schmendrick

Problemi correlati