Volviendo con lo del otro día, se me ocurrió ampliar los contratos de servicio para definir métodos asíncronos, de cara a trabajar con .Net Core este invierno. Quería hacerlo sólo en los clientes, para no tocar toda la parte de los servicios, que ya está creada, así que jugué con las compilaciones condicionales:
<ServiceContract([Namespace]:="http://CdA.Cromo.Services", SessionMode:=SessionMode.NotAllowed)> Public Interface ILotesService <OperationContract()> <FaultContract(GetType(ServiceFault))> Function Modificar(Lote As LoteSAP, InfoConfig As InfoConfiguracion) As Mensaje #If NET5_0_OR_GREATER Then <OperationContract()> Function ModificarAsync(Lote As LoteSAP, InfoConfig As InfoConfiguracion) As Task(Of Mensaje) #End If End Interface
El acceso <nombre>Async ya se crea en el servicio de serie, aunque no lo hayamos creado explícitamente (montar asincronía en WCF es un dolor de cabeza, pues es anterior al sistema de async/await). Al añadirlo al cliente para .Net Core lo único que conseguimos es que se vuelva loco y estalle. La solución, no sé por qué, es no repetir el atributo FaultContract en el método Async.
La implementación del cliente queda así:
Public Class LotesServiceClient Implements ILotesService Public Sub New(endpointConfigurationName As String) MyBase.New(endpointConfigurationName) End Sub Public Sub New(endpointConfigurationName As String, remoteAddress As String) MyBase.New(endpointConfigurationName, remoteAddress) End Sub Public Sub New(endpointConfigurationName As String, remoteAddress As EndpointAddress) MyBase.New(endpointConfigurationName, remoteAddress) End Sub Public Sub New(binding As Channels.Binding, remoteAddress As EndpointAddress) MyBase.New(binding, remoteAddress) End Sub Public Function Modificar(Lote As LoteSAP, InfoConfig As InfoConfiguracion) As Mensaje Implements ILotesService.Modificar Return Me.Channel.Modificar(Lote, InfoConfig) End Function #If NET5_0_OR_GREATER Then Public Function ModificarAsync(Lote As LoteSAP, InfoConfig As InfoConfiguracion) As Task(Of Mensaje) Implements ILotesService.ModificarAsync Return Me.Channel.ModificarAsync(Lote, InfoConfig) End Function #End If End Class
Ahora me queda meterlo en las pruebas que estoy haciendo en Blazor, a ver cómo resulta.