Si tenim un client Silverlight que per obtenir dades o executar processos ho fa a través de web services WCF, com podem dur un control i tractament de les possibles excepcions que es poden donar?
En un primer moment, es podria pensar que resulta similar al tractament d’errors en altres contextos…doncs bé, malauradament en Silverlight no és així. Els WCF suporten els anomenats “FaultContracts”, però Silverlight no suporta un service contract amb un fault contract. En cas de fer-ho el servei es convertiria inservible pels clients Silverlight. Per altra banda tampoc es podria “llençar” l’excepció i que el client Silverlight la capturi però, tot i que l’excepció s’enviarà correctament, serà el navegador qui no deixi passar aquesta informació. En aquest cas, l’únic que el client Silverlight rebrà serà una CommunicationException amb el missatge d’error “The remote server returned an error: NotFound”.
Com es pot comprovar l’error retornat no dóna cap pista de quin ha estat l’autèntic error que s’ha produït en el nostre WCF. Una possible solució seria utilitzar un paràmetre out en el servei utilitzant una wrapper type, la qual passi el tipus d’excepció juntament amb el missatge cap al client Silverlight.
El procediment del servei WCF quedaria de la següent manera:
[OperationContract] public void ProvaServei (out OwnFaultContract eWCF) { eWCF = null; try { ... } catch (Exception ex) { eWCF = new OwnFaultContract() { ExType = ex.GetType().FullName, Message = ex.Message }; } }
La classe del tipus propi pel retorn de l’error:
[DataContract] public class OwnFaultContract { [DataMember] public string ExType { get; set; } [DataMember] public string Message { get; set; } }
