2009-07-09 16 views
6

ho il sospetto questo vale per ASP.Net generale, troppo, ma non sono sicuro.sicurezza Discussione in ASP.Net MVC

Se si dispone di un metodo di azione su un controller, ad esempio MyController.DoSomethingExciting e tre client lo colpiscono "allo stesso tempo", sono intrinsecamente thread-safe o devo fare qualcosa per garantire che le tre chiamate simultanee non interagire tra loro?

risposta

13

Le variabili locali in tale metodo saranno per chiamata. Presumo (non so MVC) che le istanze del controller sono per richiesta, quindi qualsiasi membro di istanza sarebbe sicuro.

Ma se ci sono membri statici o condivisi, non sono sicuri.

+2

Sei corretto che le istanze del controller sono per richiesta – roryf

+0

Un'istanza del controller è per richiesta, lo rende thread-safe? O c'è un modo in cui un'istanza di un controller può essere utilizzata da più thread nella stessa richiesta? Voglio assicurarmi che fornisca al mio controller una variabile privata, che sia thread-safe. – xr280xr

+1

Un membro di istanza di un'istanza controller dovrebbe essere thread-safe, per quanto ne so. Ma assicurati che tutte le risorse utilizzate dal controller siano effettivamente thread-safe. Di nuovo, si noti che non so _know_ che l'istanza del controller è per richiesta. –

2

se il metodo crea un'istanza di tutte le sue variabili e non utilizza alcun membro statico, dovrebbe essere ok in tutti i casi.

L'oggetto fa riferimento a più thread contemporaneamente e legge alcune variabili di livello di classe più volte che potrebbero essere modificate da un altro thread tra le letture, quindi potrebbe esserci un problema.

Se legge solo una volta i dati e non scrive nulla a livello di classe, è improbabile che il multithreading sia un problema.

2

Non necessariamente. Dipende da cosa intendi per "sicurezza del filo".

Supponiamo ad esempio che condividano un Entity Framework, dica "db" e funzionino su qualche tabella. dal momento che hai chiamato il controller "MyController" consente di chiamare questo db.MyTable Ogni richiesta evoca una diversa istanza di MyController. Finora, thread sicuro. Ogni controller crea un'istanza di MyEntities db = new MyEntities(); Finora thread sicuro. ma poiché db.MyTable è di tipo IEnumerable <MyTable> interagiscono tra loro. Supponiamo che lavorano sulla stessa entità nel database (senza serrature), dicono db.MyTable [0] - faranno sovrascrivere l'altro ("ultimo di salvare vince").

3 utenti del sito avranno tre puntatori indipendenti (nello stack) che puntano allo stesso posto (nel database). Non è un problema di thread. È un problema di blocco dei dati.

+1

@ colin-Desmond Chiedetevi - possono due persone nel mio sistema effettivamente utilizzare la stessa risorsa (come la stessa entità di dati) e provare a scrivere (aggiornamento) insieme? – LongChalk