2016-03-16 13 views
6

Si può fare affidamento su CallContext, attraverso l'intera richiesta, quando si utilizza l'API asp.net Web?Posso fare affidamento su CallContext utilizzando l'API Web?

Ho letto il decade-old blog post e non sono sicuro che sia ancora valido (come richiesto there).

Presumendo che l'Agilità thread venga attivata, se si impostano i dati in un filtro globale, è lecito ritenere che sia presente la richiesta?

+0

Ho testato con CallContext.LogicalSetData e regolatore asincrone (per farla passare prima le discussioni e dopo) e sembra funzionare bene. Comunque è un argomento abbastanza complesso ed è difficile essere sicuri semplicemente eseguendo semplici test. – Evk

risposta

2

Si perde CallContext se ASP.Net cambia thread. In un modello asincrono, l'utilità di pianificazione asp.net si occuperà di unire le chiamate asincrone a un thread di richiesta con lo stesso HttpContext, ma non necessariamente lo stesso thread.

Esempio: una richiesta si avvia e poi si va in attesa in modo asincrono di qualche IO lento prima di tornare - mentre si sta aspettando quell'IO lento, non c'è motivo per cui il thread della richiesta non stia facendo nulla in modo che possa ottenere usato per un'altra richiesta.

ASP.Net è un grande esercizio di Thread Agility (google), e c'è anche una grande discussione su questo qui: CallContext vs ThreadStatic vs HttpContext

+0

CallContext.LogicalSetData e .LogicalGetData dovrebbero funzionare per async. – imukai

+0

@imukai 'CallContext' è stato progettato per il remoting, e hai ragione - dovrebbe funzionare per async, ma su chi è la parola? È stato progettato prima che Async esistesse. Non è documentato da nessuna parte che potrei trovare; l'unica informazione che ho è di leggere altri thread di persone che parlano e nessuno sembra essere d'accordo sul comportamento di CallContext all'interno di asp.net. È molto meglio usare un 'AsyncLocal' come è stato progettato per questo scopo e * è * documentato. – caesay

Problemi correlati