Retornar informació d’una excepció a Silverlight a través de WCF

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; }
}

Publicat dins de Silverlight | Etiquetat com a , , | Envia un comentari

Com afegir controls dinàmicament en un Custom Control de Silverlight

En el meu cas, em vaig trobar amb la necessitat de crear un Custom Control per a Silverlight, el qual havia de ser un contenidor d’altres controls, com poden ser els TextBox. Per crear un control propi de Silverlight tenim un fitxer xaml a on especificar l’estil que emprarà el control i un altre fitxer amb el codi intern específic d’aquest.

En el fitxer xaml a on es defineix l’estil, se li crea un template amb un control de tipus StackPanel a dins, i en aquest panel se li posa un nom concret per poder-lo identificar.

<Style TargetType="controls:StatusControl">
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="controls:StatusControl">
                <StackPanel x:Name="ThePanel"  Orientation="Horizontal"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Per altra banda, en el fitxer de codi definim en una nova classe el nostre control Silverlight. En ella, definim en una constant el nom que té l’StackPanel dins del ControlTemplate que s’ha definit anteriorment. Llavors, quan sobreescrivim la funció OnApplyTemplate, cridarem a la funció GetTemplateChild(…) per obtenir una referència del nostre StackPanel, especificant el nom d’aquest, a partir de la constant declarada abans.

[TemplatePart(Name = StatusControl.PanelElement, Type = typeof(Panel))]
public class StatusControl : Control
{
    private const string PanelElement = "ThePanel";
    protected Panel thePanel;
    public StatusControl()
    {
        DefaultStyleKey = typeof(StatusControl);
    }
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        // Obtenim el panel que hi ha en el template
        thePanel = GetTemplateChild(PanelElement) as Panel;
    }
}

Ara ens trobem que ja podem treballar des del codi amb la referència al nostre panel. Per això, en el cas de que es desitgés afegir un control dins del nostre control-contenidor, l’únic que caldria fer seria el següent:

public void AfegirControl()
{
    TextBlock t = new TextBlock();
    t.Text = "Etiqueta 1";
    thePanel.Children.Add(t);
}

Creem un nou control del tipus que sigui, en aquest cas un TextBlock. Li especifiquem degudament les seves propietats, com pot ser el text a mostrar i l’afegim com a “child” dins del nostre panel.

Publicat dins de Silverlight | Etiquetat com a | Envia un comentari

Introducció al consum de serveis WCF des de Silverlight

Ara ja fa un temps endarrere que m’he introduït en el món del Silverlight, ja que és la tecnologia que estic utilitzant en el projecte en el qual estic treballant. En el seu moment em vaig tindre de mirar com es consumien els serveis WCF des de Silverlight. Doncs bé a continuació deixo un video que em va anar molt bé per aprendre les bases. Concretament és un video extret de la web www.silverlight.net i l’autor és en Tim Heuer, qui s’explica d’allò més bé.

Install Silverlight

Publicat dins de Silverlight | Etiquetat com a , | Envia un comentari

Una nova etapa…

He decidit renovar una mica la meva web. Ja portava uns dies que ho tenia al cap i sempre trobava alguna cosa més important a fer abans que dedicar una estona a actualitzar-la. La principal raó d’aquest update és l’objectiu de crear un espai a on guardar totes aquelles vivències amb les que em trobo al dia a dia a la feina. És a dir, crear un recopilatori de situacions com a enginyer/programador i les seves posteriors solucions perquè si al cap d’un temps m’hi torno a trobar cara a cara amb elles, pugui resoldre-les sense perdre un altre cop el mateix temps emprat anteriorment.

Espero, també, que aquest pugui ser un lloc de consulta per aquelles persones que també busquin solucions als mateixos problemes amb els que m’hagi pogut trobar jo abans.

Publicat dins de General | Desactiva els comentaris