Estoy usando el patrón async/await en .NET 4.5 para implementar algunos métodos de servicio en WCF. Servicio Ejemplo:OperationContext.Current es nulo después de aguardar cuando se utiliza async/await en el servicio WCF
Contrato:
[ServiceContract(Namespace = "http://async.test/")]
public interface IAsyncTest
{
Task DoSomethingAsync();
}
Implementación:
MyAsyncService : IAsyncTest
{
public async Task DoSomethingAsync()
{
var context = OperationContext.Current; // context is present
await Task.Delay(10);
context = OperationContext.Current; // context is null
}
}
El problema que estoy teniendo es que después de las primeras declaraciones de await
OperationContext.Current
null
y no puedo acceder OperationContext.Current.IncomingMessageHeaders
.
En este sencillo ejemplo esto no es un problema ya que puedo capturar el contexto antes del await
. Pero en el mundo real se está accediendo al caso OperationContext.Current
desde el interior de la pila de llamadas y realmente no quiero cambiar muchos códigos solo para pasar el contexto más allá.
¿Hay alguna forma de obtener el contexto de operación después del punto await
sin pasarlo por la pila manualmente?
¿Qué significa serializar una instancia 'Task' sobre el cable al cliente? – Steven
Al usar async/await la tarea no se pasa al cliente. Wcf entiende eso como un método de devolución de nulo. El cliente que agrega una referencia a dicho servicio vería DoSomething() vacío; – mdonatas
Eso es interesante. Aún así, no estoy seguro de que realmente quieras ejecutar las operaciones de esta manera. ¿Qué haces cuando la operación falla por alguna razón? El cliente piensa que tuvo éxito exitosamente. Será mejor que ponga en cola estas operaciones en una cola transaccional de algún tipo. – Steven