Depuración de errores en servicios WCF

Windows Communication Foundation agrega eventos en el registro de Windows de manera predeterminada, por seguridad, depuración, mantenibilidad... es posible utilizar mecanimos adicionales con las trazas.

Añadiendo la siguiente configuración de diagnóstico en nuestro web.config o app.exe.config:

<configuration>  
   <system.diagnostics>  
      <sources>  
            <source name="System.ServiceModel"   
                    switchValue="Information, ActivityTracing"  
                    propagateActivity="true">  
            <listeners>  
               <add name="traceListener"   
                   type="System.Diagnostics.XmlWriterTraceListener"   
                   initializeData= "D:\log\registro.svclog" />  
            </listeners>  
         </source>  
      </sources>  
   </system.diagnostics>  
</configuration>

Posible errores no visibles, dificiles de acotar o reproducir aparecen claros y detallados, hasta el más sencillo que se nos puede pasar por alto:

en System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type)
   en WriteresultadoOperacionToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )
   en System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
   en System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
   en System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
   en System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
   en System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
   en System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
   en System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)
   en System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(XmlDictionaryWriter writer, PartInfo part, Object graph)
   en System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter(XmlDictionaryWriter writer, PartInfo part, Object graph)
   en System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter writer, MessageVersion version, String action, MessageDescription messageDescription, Object returnValue, Object[] parameters, Boolean isRequest)
   en System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(XmlDictionaryWriter writer, MessageVersion version, Object[] parameters, Object returnValue, Boolean isRequest)
   en System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)
   en System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   en System.ServiceModel.Channels.Message.OnWriteMessage(XmlDictionaryWriter writer)
   en System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota)
   en System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
   en System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage(Message message, Boolean shouldRecycleBuffer)
   en System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
   en System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.SendReplyCore(Message message, TimeSpan timeout)
   en System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.SendReply(Message message, TimeSpan timeout)
   en System.ServiceModel.Channels.HttpRequestContext.OnReply(Message message, TimeSpan timeout)
   en System.ServiceModel.Channels.RequestContextBase.Reply(Message message, TimeSpan timeout)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc& rpc)

Se transforma en algo tal que así:

 

Referencias:

  • Configurando seguimiento: enabling tracing
  • Editor gráfico de configuración WCF: bindings, behaviors, services and diagnostics
    NOTA: la ruta puede variar al ejecutable del SDK según versión, por ejemplo
    C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools

Visual Studio 201X + Fall Creators Update

Lo que a priori puede parecer alarmante, en equipos de desarrollo con Visual Studio instalado, después de instalar la actualización para Windows 10 Fall Creators Update:

[ArgumentOutOfRangeException: El argumento especificado está fuera del intervalo de valores válidos.
Nombre del parámetro: site]
   System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags, PolicyLevel policyLevel, Exception appDomainCreationException) +280

 

Se soluciona sencillamente volviendo a instalar IIS desde el Panel de control\Programas\Programas y características en "Activar o desactivar las características de Windows"

 

Podremos volver a depurar proyectos web en tiempo real sin necesidades de reiniciar. Por algún motivo desconocido durante el proceso se desactiva.

 

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)

 

 

 

Nacionalistas buscan martir

Europa ha sufrido con anterioridad repetir una mentira mil veces y nunca ha terminado bien. Habiendo nacido, crecido y vivido en una provincia donde has escuchado siempre la misma canción adoctrinadora, no resulta fácil alzar la voz frente a la manipulación, señalado y marcado por discrepar frente a las invenciones.
 
El interés propio es necesario para que la deshonestidad se intensifique, durante años se ha adoctrinado desde los colegios a niños que hoy votan con una visión sesgada y reducida de la realidad que les rodea.

Un ejemplo simplificado: si durante años en la televisión vasca han mostrado la predicción meteorológica de Euskadi y Navarra juntas con diferentes escusas. Un niño que siempre lo ha visto de esa forma, tenderá a pensar que es lo normal… los medios con los que el nacionalismo se vale para influenciar en la educación es el caldo de cultivo para lo que esta ocurriendo en nuestros días, tanto en Cataluña como en otras comunidades.

La empatía entre las partes, resulta más difícil y asimétrica en cuanto más mentiras enturbian el fondo de la cuestión. Contra más tiempo pasa, más mentiras se acumulan, más difícil acercar posiciones, más complicado despejar la verdad.

Puedo comprender en parte, en un momento dado, llegar a votar a populismos desde la rabia, cayendo en las trampas de un discurso elaborado con lo que todo español cabreado por una situación de crisis podría pensar.

Frente a un contenido vacío de propuestas realistas siempre llega la coherencia necesaria, nunca desde la vieja escuela ni desde el discurso facilón.

No se equivoquen, el uno de octubre esta planeado desde hace tiempo, la búsqueda de confrontación física en la calle es una de las armas que utilizarán sin dudarlo. Que más desean en el des-gobierno actual de Cataluña que la foto de uno de sus integrantes con sangre o grilletes llenara la prensa, todo en favor de su dogma.
 
Esperemos que el Gobierno de España no materialice, como solución rápida, la asignación pública o en diferido de mayores beneficios fiscales o competencias. Postergando un nuevo enfrentamiento para generaciones futuras. Una más a añadir a la historia reciente.

Nacionalistas y populistas tienen un objetivo común, romper y dividir España en su propio beneficio.


Algo a lo que no estamos acostumbrados, en público sobre todo, luchar contra la mentira. La actitud pasiva de quienes no defienden la verdad es suficiente para que la deshonestidad se imponga por repetición. No es posible quedarse callado.
 
  • Carles Puigdemont: “Defenderemos hasta el final el derecho de todos los catalanes a decidir su futuro”
    En Cataluña se han celebrado 35 elecciones con garantías democráticas, entre ellas la ratificación de la constitución por mayoría.

  • Carles Puigdemont: “Los ciudadanos estamos convocados el día 1 de octubre para defender la democracia frente a un régimen represivo e intimidatorio”
    Mientras señaláis en carteles a quienes no comulgan con el nacionalismo.

  • Pablo Iglesias: “Si alguna vez llegamos al ejecutivo permitiremos que los catalanes puedan votar en un referéndum de autodeterminación”
    O como un comunista declarado tomaría el paso previo a un resultado no deseado, como en 1956 en Hungría.
     
  • Irene Montero: “Formaremos una Asamblea de parlamentarios y alcaldes por la libertad, la fraternidad y la convivencia frente a la opresión antidemocrática del PP”
    Por que el resultado de las elecciones parece no ser lo suficientemente democrático para sus intereses, excluyendo a quienes no piensan como ellos, se gana su mayoría como en los países a los que apoyan abiertamente…

 

 

Fuentes de alimentación Samsung: TV y monitores

Nos encontramos con un monitor de ordenador, pero se aplica también a televisores, el cual aleatoriamente se pone la pantalla en negro, puede que primero se encienda unos segundos, luego se apague, o tarde en encender desde segundos a minutos... cada vez funciona menos tiempo... "le cuesta arrancar al monitor" suelen describirlo. El piloto indicador esta iluminado pero el panel no muestra ninguna imagen, ni siquiera cuando pulsamos en los botones del propio monitor (menú, brillo...)

La fuente de alimentación ha empezado a funcionar mal, aunque es capaz de suministrar algo de tensión. En estos casos la propia placa suele estar protegida, al no llegar la corriente correcta se apaga. El problema y la solución que se describe a continuación es habitual, pero no quiere decir que sea el único posible problema.

Lo primero desmontamos el monitor, puedes utilizar una espátula de plástico o metal, mejor que un destornillador plano para no dejar marcas. La mayoría de estos modelos Samsung de la época no tienen ningún tornillo, van ensamblados con pestañas de plástico a presión, entre el marco trasero y el frontal:

Una vez quitada tapa exterior, con cuidado de no golpear el panel frontal, retiramos la protección de los conectores, dos solapas que mostraran las clavijas, en este caso son 4 (cuidado de no intercambiarlos entre ellos, marcarlos antes de retirarlos. En la parte superior presionar las dos pestañas para deslizar el conector plano hacia fuera, en conector lateral tiene una pequeña lengüeta igual que los del lado opuesto:

Ya tenemos acceso a la fuente de alimentación, Samsung suele nombrarlas como BN44-XXXXXX según cada modelo, en este caso BN44-0123B. Desconectamos el arnés y retiramos los 3 tornillos, el inferior izquierdo de la foto es el que hace masa con el cuerpo metálico y es diferente a los otros dos:

Con la fuente de alimentación fuera, observamos (en este caso) uno de los condensadores (capacitadores) dañado. Se puede apreciar a simple vista (en la foto algo más difícil, se señala con la flecha roja), en otros casos pueden estar rotos/explotados, dependiendo del tipo se separan de las placas o de la cubierta.

Junto al condensador en mal estado a la izquierda, el nuevo que sustituiremos des-soldando de la placa. Con la molestia que nos hemos tomado, podemos sustituir los otros 3, aunque no parezca que tengan daños externos, el coste de los 4 es inferior a los 50 céntimos.

Volvemos a montar a la inversa, podremos seguir funcionando con nuestro monitor. Este mismo proceso puede aplicarse a otros modelos y fabricantes similares.