Archive for the ‘WCF’ Category

Mi servicio WCF dejo de escribir logs

28 junio 2010

 

Problema: Tengo un servicio WCF, y tengo habilitado el escribir logs, ya sea mediante el sistema de log que trae WCF o mediante un custom listener para poder usar alguna libreria de logs (como NLog o Log4Net). El problema es que en un momento dado para de escribir logs, aunque mi servicio sigue funcionando normalmente. Si reinicio el servicio, vuelve a escribir logs.

Solucion: Seguramente el valor de la propiedad “maxMessagesToLog” no ha sido configurado. Esta propiedad tiene un valor por defecto de 1000, y cuando se llega a ese limite se deja de escribir nuevos logs.

Para eliminar este limite, usar el valor –1

<system.serviceModel>
    <diagnostics>
        <messageLogging maxMessagesToLog="-1" />
    </diagnostics>
</system.serviceModel>

Anuncios

Stacktrace de un servicio WCF

20 abril 2010

 

Problema: Tengo un servicio WCF que me casca. Como puedo ver el volcado de la pila?

Solucion: Marcar la clase que implementa el contrato con el siguiente atributo

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]

WCF me añade un elemento root al serializar las clases

14 abril 2010

 

Problema: He creado una clase con un serializador a medida implementando el interfaz IXmlSerializable, pero WCF añade al xml resultante un elemento raiz adicional con el nombre de la clase y con un namespace propio.

Solucion: Tendremos que marcar la clase con el siguiente atributo para indicarle a WCF los valores para el nodo raiz:

[XmlRoot(Namespace=http://uri.org, ElementName="raiz")]

El atributo se encuentra en el namespace System.Xml.Serialization

WCF no me serializa a XML como yo quiero

14 abril 2010

 

Problema: Necesito serializar mis datos de una forma diferente a como lo hace el serializador que usa WCF (DataContractSerializer), ya sea porque sus opciones son limitadas (no permite usar atributos en el XML) o porque necesito una estructura diferente en el XML a la que me ofrece el serializador.

Solucion: Proveer a la clase a serializar de un serializador a medida, al que llamara WCF. Para ello hacemos que la clase a serializar  implemente el interfaz System.Xml.Serialization.IXmlSerializable. Deberemos implementar el metodo WriteXml donde podremos crear un XML a partir de la clase a mano y a nuestro gusto. (Nota: estaremos obligados a implementar tambien el metodo GetSchema, pero bastara con añadir una linea con “return null”

Que tengo que poner en el web.config para crear un servicio WCF que trabaje con soap, xml y json?

14 abril 2010

 

Problema: Quiero crear un servicio web con WCF con 3 endpoints, uno para soap, otro para json y otro para xml, y no se que tengo que especificar en el webconfig.

Solucion: Tras crear con VS nuestro proyecto WCF, ya tendremos el primer endopint creado para soap. Para los otros dos endpoints habria que añadir lo sieguiente:

Dentro de <system.serviceModel> añadimos la seccion <bindings> (si no esta ya)

<bindings>
        <webHttpBinding>
        <binding name="webBinding">
        </binding>
    </webHttpBinding>
</bindings>

En la seccion <services>, dentro del <service> que ya tendremos creado (y que ya contara con algun endpoint) añadimos dos mas

<endpoint name="xml" address="xml" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="XMLBehavior" contract="IContractService"/>

<endpoint name="json" address="json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="JSONBehavior" contract="IContractService"/>

 

Finalmente en la seccion <behaviors> añadimos

<endpointBehaviors>
<behavior name="XMLBehavior">
    <webHttp/>
</behavior>
<behavior name="JSONBehavior">
    <enableWebScript/>
</behavior>
</endpointBehaviors>

Por ultimo, si las llamadas xml las queremos hacer usando el metodo POST, deberemos marcar los metodos en cuestion del contrato con el atributo [WebInvoke(Method = “POST”)]. Ademas, tendremos que añadir una referencia a System.ServiceModel.Web en nuestro proyecto.