configurar .net wcf asynchronous async-await channelfactory

configurar - ¿Cómo agregar soporte asíncrono a un servicio.NET 4.5 WCF para que no interrumpa a los clientes existentes?



configurar endpoint wcf (1)

Tengo un servicio WCF existente con un punto final SOAP, usando .NET 4.5. La mayor parte del código de cliente existente está utilizando el enfoque proxy de ChannelFactory<T> .

Me gustaría cambiar el servicio para admitir el modelo async / await para varias operaciones de E / S y bases de datos del lado del servidor.

El problema que tengo es que agregar la palabra clave async a las llamadas al método WCF requiere cambiar sus firmas de interfaz a la Task<T> . Eso, a su vez, parece requerir cambios en el código del cliente.

Si bien mantiene el código de servicio asincrónico "completamente abajo", ¿existe una forma directa de mantener la API expuesta sin cambios?


Mientras cambie el nombre del método del lado del servidor para incluir la palabra XxxxxAsync , no cambiará la firma del lado del XxxxxAsync .

WCF crea automáticamente dos puntos finales para cada método, una versión síncrona y una versión asincrónica. Puedes ver esto con el cliente de prueba WCF.

Por ejemplo, el siguiente contrato de servicio

[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); } public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } }

Cuando encienda el cliente de prueba WCF verá 2 métodos disponibles

Si cambio el código a la siguiente

[ServiceContract] public interface IService1 { [OperationContract] Task<string> GetDataAsync(int value); } public class Service1 : IService1 { public async Task<string> GetDataAsync(int value) { await Task.Delay(value); return string.Format("You entered and awaited: {0}", value); } }

Todavía puedo llamar al método síncrono string GetData(int) de mi cliente

Tenga en cuenta que ya no podrá usar la misma interfaz del lado del cliente y del servidor para representar la API (y realmente no debería hacerlo, la interfaz del lado del cliente debería tener ambas versiones. De esta forma, el cliente puede decidir si desea realizarla). una llamada de bloqueo o no). Sin embargo, aún podrá usar modelos compartidos entre ellos.