Cliente WCF asíncrono

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.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.