2012-09-02 35 views
7

Cuando tratamos con algunos puntos de extensibilidad en ASP.NET Web API, también trabajamos con TAP (Patrón de programación basado en tareas). En algunos puntos, queremos proporcionar una continuación a un método asíncrono con ContinueWith y hacemos algunas cosas dentro del delegado que pasamos al ContinueWith.SynchronizationContext y ASP.NET Web API Extensibility Points

Como Brad Wilson explicó here en profundidad que el SynchronizationContext es vital cuando proporcionamos continuaciones. Para mí, el único lugar donde necesito volver al SynchronizationContext en ASP.NET Web API es el lugar donde tengo que jugar con HttpContext.Current (que es algo que nunca haría en una aplicación ASP.NET Web API) y el lugar donde necesito establecer cierta información para el hilo basado como Thread.CurrentPrincipal.

Así que la pregunta es: ¿alguna vez queremos volver al SynchronizationContext cuando proporcionamos continuaciones en algunos puntos de extensibilidad como manejadores de mensajes, filtros, formateadores, etc.?

Respuesta

2

La respuesta es casi siempre .

Eso no quiere decir que siempre vaya a use el contexto de sincronización, pero dada la naturaleza de los manejadores de mensajes, filtros y formateadores, no puede predecir si requerirán o no el uso de SynchronizationContext para acceder al HttpContextBase.

Incluso con filtros, en el que estés pasaste algo que le da acceso a la HttpContext (dicen a través de un IActionFilter implementation), que HttpContext se va a ver en última instancia a la corriente CallContext en el hilo para proporcionar la información de esa instancia. Debido a que el hilo actual (cuando se ejecuta de manera asíncrona) no tiene esa información cuando comenzó el Task, esas llamadas fallarán.

Dicho esto, si es necesario, el acceso sin restricciones generales a HttpContextBase asociado con la petición, entonces usted absolutamente tiene que pasar alrededor de la SynchronizationContext con el fin de acceder a él.

Sin embargo, si es posible, debería copiar los datos a cabo del HttpContextBase que necesita, y pasar que alrededor; si estás escribiendo algo muy generalizado, entonces esto no será posible.

+0

¡Gracias por la respuesta! Creo que mezcló la pregunta con ASP.NET MVC. Supongamos que no estás en ASP.NET Host. Entonces, no tendrás el HttpContext. Entonces, los puntos de extensibilidad no están estrechamente relacionados con aquellos. – tugberk

+0

@tugberk La respuesta sigue siendo la misma, de verdad; si tiene algo que está vinculado a un contexto particular, y luego desea sincronizarlo, realmente quiere asegurarse de copiar los valores fuera del contexto (o asegurarse de que puede acceder de nuevo * a * el contexto) que usted Necesitaremos procesamiento. – casperOne

+0

el problema es que: en la API web, casi no tiene contexto. Puedes ver el contexto dentro de las variables que se transportan a través de thread + the framework infrastructure siempre regresas al contexto de sincronización si miras el código fuente. Es por eso que tu respuesta no es aplicable. – tugberk