2012-09-02 13 views
7

Quando ci occupiamo di alcuni punti di estensibilità nell'API Web ASP.NET, ci occupiamo anche di TAP (Pattern di programmazione basata sulle attività). In alcuni punti, vogliamo fornire una continuazione a un metodo asincrono con ContinueWith e facciamo alcune cose all'interno del delegato che passiamo su ContinueWith.Punti di estensibilità dell'API SynchronizationContext e Web ASP.NET

Come spiega Brad Wilson here in profondità che il SynchronizationContext è di vitale importanza quando forniamo continuazioni. Per me, l'unico posto in cui ho bisogno di tornare al SynchronizationContext in API Web ASP.NET è il luogo in cui ho bisogno di giocare con HttpContext.Current (che è qualcosa che non avrei mai fatto in un'applicazione API Web ASP.NET) e il luogo in cui ho bisogno di impostare alcune informazioni per thread based come Thread.CurrentPrincipal.

Quindi la domanda è: vogliamo mai tornare allo SynchronizationContext quando forniamo continuazioni in alcuni punti di estensibilità come gestori di messaggi, filtri, formattatori, ecc.?

risposta

2

La risposta è quasi sempre .

Questo non vuol dire che vai sempre a usa il contesto di sincronizzazione, ma data la natura di gestori di messaggi, filtri e formattatori, non puoi prevedere se richiederanno o meno l'uso di il SynchronizationContext per accedere allo HttpContextBase.

Anche con i filtri, dove stai superati qualcosa che consente di accedere alla HttpContext (dicono attraverso un IActionFilter implementation), che HttpContext sta andando a guardare in ultima analisi, alla corrente CallContext sul filo per fornire le informazioni da tale istanza. Poiché il thread corrente (quando è in esecuzione asincrona) non contiene tali informazioni al momento dell'avvio di Task, tali chiamate avranno esito negativo.

Detto questo, se avete bisogno generale, libero accesso alle HttpContextBase associato alla richiesta Allora ti assolutamente devi passare tutto il SynchronizationContext al fine di accedervi.

Tuttavia, se possibile, è necessario copiare i dettagli fuori del HttpContextBase di cui avete bisogno, e passare che intorno; se stai scrivendo qualcosa di molto generalizzato, allora questo non sarà possibile.

+0

Grazie per la risposta! Penso che tu abbia mescolato la domanda con ASP.NET MVC. Supponiamo che tu non sia in Host ASP.NET. Quindi, non avrai HttpContext. Quindi, i punti di estensibilità non sono strettamente associati a quelli. – tugberk

+0

@tugberk La risposta è sempre la stessa, davvero; se hai qualcosa legato a un particolare contesto e poi vuoi andare asincrono, vuoi veramente assicurarti di copiare i valori fuori dal contesto (o assicurarti di poter accedere di nuovo * al * contesto) che tu Avrò bisogno di elaborazione. – casperOne

+0

il problema è che: in Web API, non hai praticamente alcun contesto. È possibile il contesto all'interno delle variabili che vengono trasportate attraverso il thread + l'infrastruttura di framework torna sempre al contesto di sincronizzazione se si guarda il codice sorgente. Ecco perché la tua risposta non è applicabile. – tugberk

Problemi correlati