Esiste una possibile condizione di gara & # 8221; quando si utilizza Asp.Net MVC TempData attraverso un reindirizzamento?

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

Domanda

Quando si utilizza TempData, la mia comprensione è che manterrà tutto ciò che lo metti in giro per una sola richiesta. Pertanto, quando si utilizza TempData per conservare i dati attraverso un reindirizzamento (al fine di utilizzare il modello Post-Request-Get), non è possibile che qualche altra richiesta da parte dell'utente possa entrare nel server tra la risposta che invia il reindirizzamento e il browser dell'utente che richiede la pagina reindirizzata? Nel qual caso il get non avrebbe più i TempData disponibili, giusto?

Ora, capisco che qualcosa del genere sarebbe molto raro, ma considerando che l'utente potrebbe avere un'altra pagina aperta in un'altra scheda e che potrebbero esserci richieste ajax o di richiamata temporizzata su quella pagina, all'improvviso non mi sembra tutto così impossibile. È generalmente considerato troppo remoto per preoccuparsi o sto fraintendendo qualcosa?

Modifica: per essere più specifici sullo scenario di cui mi stavo chiedendo.

  1. Nella scheda 1 l'utente passa a una pagina con un modulo di posta
  2. Nella scheda 2 l'utente naviga su un'altra pagina del sito che lo fa ajax richiamate su un timer
  3. Nella scheda 1, l'utente pubblica il modulo sul server
  4. Quando il server riceve la posta, salva alcuni dati in TempData e restituisce una risposta di reindirizzamento
  5. Nella scheda 2, si verifica la richiamata ajax temporizzata, che invia una richiesta GET al server. TempData viene rimosso dalla sessione
  6. Nella scheda 1, il browser riceve il reindirizzamento ed emette una richiesta GET
  7. Il server elabora la richiesta GET e cerca TempData, ma non è più presente
È stato utile?

Soluzione

Bene, l'esplorazione del codice MVC ASP.NET mostra che mentre TempData è archiviato nella sessione, viene rimosso dalla sessione quando viene caricato. E viene caricato nel metodo ExecuteCore () del controller.

Quindi penso che significherebbe che sì, potresti incappare in una condizione di competizione in cui una richiesta da una diversa scheda del browser (hai avuto un buon esempio) potrebbe causare questo problema. Ciò dipende dal modello di ciascun browser per la gestione delle richieste. Un browser potrebbe serializzare tutte le richieste sullo stesso server in modo che solo una venga eseguita alla volta. In realtà, non lo faranno, tuttavia, lo limiteranno al massimo che è (credo) 5 richieste simultanee allo stesso server.

Dato che un sito ASP.NET MVC potrebbe essere una richiesta di servizi a qualsiasi browser (è il web, dopotutto :)) è uno scenario reale, anche se probabilmente raro, come hai detto.

Altri suggerimenti

È assolutamente possibile avere una race condition quando si utilizza TempData. Tuttavia, dovresti ovviamente essere "sfortunato". per sperimentarlo durante il normale utilizzo. Per correre nelle condizioni di gara, devono essere vere tutte le seguenti condizioni:

  1. Devi usare TempData per cominciare.
  2. Devi avere più finestre / schede / finestre aperte del browser e condividere la stessa sessione del browser.
  3. Una richiesta dalla seconda scheda del browser deve " intrufolarsi in " tra la richiesta e la risposta della prima scheda del browser.

Nota che l'articolo # 2 dipende molto dal browser che stai utilizzando. A seconda di come hai configurato IE, solo perché hai più finestre aperte non significa che condividano i cookie del browser e quindi non necessariamente condividano le sessioni (che sono basate sui cookie).

Tuttavia, non esiste alcuna condizione di competizione, nel senso che qualcosa esplode se ci si imbatte. Questo potrebbe essere ciò a cui Haacked si riferisce. Ma puoi raggiungere una condizione di competizione, nel senso che hai impostato alcuni TempData in una richiesta e poi non l'hai recuperato nella richiesta successiva dove pensavi che stavi andando capirlo. Sarà solo vuoto.

Grazie, Eilon

TempData utilizza l'oggetto Session, che non presenta questo problema, AFAIK. Hai riscontrato un problema specifico con questo?

Penso che non accadrà mai, anche se all'inizio ho la stessa confusione. Pensaci se esegui la tua applicazione web mvc in modalità debug, imposti un punto di interruzione in un'azione di reindirizzamento e dai a tempdata un valore, quindi otterrai il tempdate in redirect viewResult e l'altra vista, scoprirai che l'altra richiesta non avrà mai risposta fino al completamento dell'azione di reindirizzamento. Quindi cosa significa? Ha detto che l'applicazione mvc viene eseguita in modalità thread singolo, può elaborare una singola richiesta in una volta. Quindi lo scenario sopra menzionato non può mai accadere.

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