MainMind

True & racing de norte a sur


Sintaxis en servicios WCF asíncronos

A la hora de generar servicios escalables que aprovechen el procesamiento en paralelo algunos detalles sintácticos deben realizarse literalmente. La nomenclatura puede perderse por el camino generando errores en el momento de ejecutar los servicios:

Your begin method must take an AsyncCallback and an object as the last two arguments and return an IAsyncResult.

Signatura no válida del método Begin asincrónico para el método miFuncionAsyncIniciar en el tipo de XXXX. El método Begin debe tomar AsyncCallback y un objeto como los dos últimos argumentos y devolver IAsyncResult

 

El procedimiento debe tener asociadas la tareas iniciando con el nombre Begin con los dos últimos parámetros AsynCallBack y object:

 

public interface IEjemplo
{

    [OperationContractAttribute]
    string MiFuncion(string mensaje, int otroParametro);

    [OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginMiFuncion(string mensaje, int otroParametro, AsyncCallback callback, object asyncState);

    //No se especifica OperationContractAttribute para el método de finalización.
    string EndMiFuncion(IAsyncResult result);

}

La documentación esta clara pero la traducción puede generar confusión con un sencillo erros de sintaxis obligatoria. 

 

How to: Implement an Asynchronous Service Operation

Sessions, Instancing, and Concurrency

 

Ejemplo completo de una excepción tipo:

 

System.InvalidOperationException: Signatura no válida del método Begin asincrónico para el método UnirAsyncIniciar en el tipo de ServiceContract XXXXXX. El método Begin debe tomar AsyncCallback y un objeto como los dos últimos argumentos y devolver IAsyncResult.
   en System.ServiceModel.Description.ServiceReflector.IsBegin(OperationContractAttribute opSettings, MethodInfo method)
   en System.ServiceModel.Description.TypeLoader.CreateOperationDescription(ContractDescription contractDescription, MethodInfo methodInfo, MessageDirection direction, ContractReflectionInfo reflectionInfo, ContractDescription declaringContract)
   en System.ServiceModel.Description.TypeLoader.CreateOperationDescriptions(ContractDescription contractDescription, ContractReflectionInfo reflectionInfo, Type contractToGetMethodsFrom, ContractDescription declaringContract, MessageDirection direction)
   en System.ServiceModel.Description.TypeLoader.CreateContractDescription(ServiceContractAttribute contractAttr, Type contractType, Type serviceType, ContractReflectionInfo& reflectionInfo, Object serviceImplementation)
   en System.ServiceModel.Description.TypeLoader.LoadContractDescriptionHelper(Type contractType, Type serviceType, Object serviceImplementation)
   en System.ServiceModel.Description.ContractDescription.GetContract(Type contractType, Type serviceType)
   en System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implementedContracts)
   en System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)
   en System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
   en Microsoft.Tools.SvcHost.ServiceHostHelper.CreateServiceHost(Type type, ServiceKind kind)
   en Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)