WCF: Say goodbye to Windows Communication Foundation

wcf-logoCon la nueva integración de todo ASP.NET que incluye WebApi y SignalR, si tenemos que desarrollar y diseñar nuevas APIs de servicios web, hasta ahora usamos WCF para ello, pero desde hace un tiempo, Microsoft ya no recomienda esta tecnologia y deberiamos descartarla para nuevos proyectos.

Yo he utilizado WCF durante varios años, tanto para servicios web XML como REST y tengo que reconocer que me ha dado buenos resultados en los proyectos, pero como todo, en nuestro mundo tecnológico evoluciona para algo mejor, aparecen WebApi y SignalR, mucho más fácil de diseñar y gestionar a la hora de crear los servicios web API/REST.

Desafortunadamente, Microsoft no tiene la costumbre de anunciar cuando ya no esta recomendanda una tecnología específica para el desarrollo de nuevas aplicaciones y tenemos que enterarnos de forma indirecta.

 

guia-net-tech-guidance-ba

Si quereis saber más, aqui teneis la nueva guía de Microsoft para descargar en PDF, donde recomenienda dejar WCF y cambiar a WebApi entre otras cosas.

Nos leemos!!

 

Anuncios

WCF: Activar Contadores de Rendimiento “Performance Counters”

Los contadores de rendimiento nos permiten diagnosticar y monitorizar en producción el comportamiento de nuestra aplicación/servicio y saber su consumo a nivel de CPU, memoria, red, I/O y otras métricas que nos pueden servir para determinar si todo esta funcionando correctamente o tenemos algún problema.

Problemas de rendimiento

En el caso de servicios WCF, si tenemos problemas de rendimiento, una forma rápida de investigar es activar los contadores en nuestro “.config”, para empezar a tener métricas de uso, como referencia, un servicio WCF debe aceptar entre 200-500 pet/segundo en un entorno normal, también afecta al rendimiento la configuracion de hardware y software en producción sobretodo si el servidor esta “virtualizado” con recursos compartidos o tenemos un servicio WCF único muy grande o separados en varios independientes.

Importante, una vez realizado el diagnóstico y monitorización recordar que siempre debemos desactivarlos para no afectar al sistema en producción.

Activar Contadores WCF

<configuration>
<system.serviceModel>
<diagnostics performanceCounters=”All” />
</system.serviceModel>
</configuration>

Desactivar Contadores WCF

<configuration>
<system.serviceModel>
<diagnostics performanceCounters=”Off” />
</system.serviceModel>
</configuration>

Lista de Contadores WCF

Disponemos de 3 grandes bloques de contadores de rendimiento WCF que podemos consultar para tener información de primera mano de como esta trabajando nuestro servicio WCF, la lista completa de información seleccionable incluye calls, failed, faulted, duration, instances, etc:

Consultar Contadores WCF

Seguidamente, para consultar los contadores, usaremos la herramienta de Windows, Performance monitor (perfmon.exe) que viene instalada en todas las versiones de Windows y añadiremos los contadores que nos interesa al gráfico para verlos en tiempo real.

Abrir perfmon.exe y situarnos en la opción “monitor de rendimiento” para ver la gráfica general del estado de CPU.

Después, pulsar el botón [+] para añadir los contadores WCF de la lista que nos interese monitorizar (aquí veremos los 3 grupos comentados anteriormente) seleccionamos lo deseado y pulsar botón OK.

Throttling WCF

Como sabemos, esto no es una ciencia exacta, hay que analizar cada escenario en producción para aplicar la configuración más óptima, para ello, podemos cambiar la configuración de WCF, teniendo en cuenta que siempre debemos medir de nuevo una vez realizados los cambios para saber si hemos obtenido una mejora de rendimiento.

Recordar que los servicios WCF tienen esta configuración por defecto:

Property .NET 4.0 Default .NET 3.5 Prev
MaxConcurrentCalls 16 * Processor 16
MaxConcurrentInstances 116 * Processor 26
MaxConcurrentSessions 100 * Processor 10
Importante
  • MaxConcurrentCalls: How many number of request can be accepted by a service (Should be set to less than the SQL connection pool size).
  • MaxConcurrentInstances: How many number of instances of service can be created by a service (Keep in mind the relationship between the MaxConcurrentInstances property and the InstanceContextMode property).
  • MaxConcurrentSessions:  How many number of request can be processed by a service (When this property is set to a value less than the number of client threads, the requests from multiple clients may get queued in the same socket connection).

 

Cambiando Throttling WCF

Podemos usar los <behaviors> en nuestro archivo app.config ó web.config para definir los parametros que adopte nuestro servicio WCF, recordando lo anteriormente comentado, volver a medir para ver si ganamos o perdemos rendimiento.

 <behaviors>
  <serviceBehaviors>
   <behavior name="throttlingBehavior">
    <serviceThrottling maxConcurrentCalls="16" 
                       maxConcurrentInstances="2147483647" 
                       maxConcurrentSessions="10" />
   </behavior>
  </serviceBehaviors>
 </behaviors>

Conclusión

Como veis, no es muy complicado, en Youtube existen muchos videos más detallados de como interpretar toda esta información.

Nos leemos!!

WCF: Fix WSWS3173E Client security header MustUnderstand=0

wcf-logo

Un poco de introducción a WSE

Los servicios Web ofrecen comunicación con diferentes sistemas operativos y plataformas. Para conseguir este objetivo, se basan en una familia de especificaciones de protocolos industriales para los servicios Web, que generalmente se denomina WS-*.

WSE ofrece ventajas como seguridad de extremo a extremo en el nivel de los mensajes, enrutamiento basado en contenidos y directivas que aprovechan las especificaciones WS-Security, WS-Addressing y WS-Policy  y proporciona implementaciones de muchas de estas especificaciones para aquellos programadores que deseen ser los primeros en utilizar la tecnología de última generación para los servicios Web.

Web Services Enhancements (WSE) 3.0 for Microsoft .NET

WSE, que se puede descargar gratuitamente, es totalmente compatible y amplía la compatibilidad actual de los servicios Web de .NET Framework. Aunque no se ofrecen garantías de que la versión 2.0 vaya a ser compatible en cuanto a la conexión y el modelo de objeto con las principales futuras versiones de WSE 3.0, la compatibilidad de lado a lado está garantizada.

Como cambiar header MustUnderstand=”0″

Recientemente, hemos tenido problemas para conectarnos con WebService hecho con Java, JAX-WS y Axis2 por temas de Seguridad basado en el estandar OASIS (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd), y esta es la solución adoptada para enviar las cabeceras de seguridad.

En este artículo, explican detalladamente como solucionarlo en Java pero no con NET: http://wso2.com/library/tutorials/understand-famous-did-not-understand-mustunderstand-header-s-error/

En nuestro caso, debemos enviar al servidor una cabecera con esta estructura.

<soapenv:Header>
<wsse:Security …>
   <wsse:UsernameToken>
   <wsse:Username>…</wsse:Username>
   <wsse:Password>…</wsse:Password>
   </wsse:UsernameToken>
   </wsse:Security>
</soapenv:Header>

Solucion .NET

La solucion en NET, es simple, añadir al app.config o web.config lo siguiente:

En customBinding o httpBasicBindind:
  <customBinding>
     <binding name="CustomBindingExportacion" >          si existen  quitar marcas <security> y <mtomMessageEncoding>
          <!--<security authenticationMode="UserNameOverTransport" includeTimestamp="False"/>
          <!--<mtomMessageEncoding messageVersion="Soap11" />-->           poner esto para Soap11:
          <textMessageEncoding messageVersion="Soap11" /> poner esto para https si es necesario:
          <httpsTransport />
        </binding>
      </customBinding>
En client – endpoint: ponemos cabecera de seguridad a mano indicando el user y password y lo quitamos del código fuente si lo tuvieramos
    <client>
      <endpoint address="https://servidor:443/services/NombreWebService"
                binding="customBinding"
                bindingConfiguration="CustomBindingExportacion"
                contract="contratoImplWS"
                name="nombreEndPoint">

     <headers>
          <wsse:Security s:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
             <wsse:UsernameToken>
               <wsse:Username>usuario</wsse:Username>
               <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password-plano-o-encriptrado-md5-sha1</wsse:Password>
             </wsse:UsernameToken>
          </wsse:Security>
        </headers>

      </endpoint>
    </client>
Volver a compilar y probamos… ahora deberia funcionar correctamente.
El error  mustUnderstand=”1″ anterior:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
    <Misunderstood qname="o:Security" xmlns="http://www.w3.org/2002/06/soap-faults" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" />
</soapenv:Header>
<soapenv:Body>
    <soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <faultcode>soapenv:MustUnderstand</faultcode>
        <faultstring>WSWS3173E: Error: Did not understand &quot;MustUnderstand&quot; header(s):{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security</faultstring>
    </soapenv:Fault>
</soapenv:Body>
queda solucionado!!

 

WCF: Curso Gratis Windows Communication Foundation

Curso gratuito sobre WCF para introducirse en esta tecnología. Como define Microsoft, Windows Communication Foundation, es un modelo de programación unificado para compilar aplicaciones orientadas a servicios y soluciones con transacción seguras y de confianza, que se integren en diferentes plataformas interoperables.

Los conceptos mas importantes de este curso sobre WCF son:

  • Services
  • Contracts
  • Messages
  • Endpoints
  • Bindings
  • Reliable Messaging
  • Security
  • Transport Layer
  • WCF Clients
  • Integration of workflow (WF) as Workflow Enabled Services
  • Tools for WCF in Visual Studio 2008 / 2010
  •  WCF configuration editor and the web service test host
  • Syndication as a way of exposing a WCF service using RSS or ATOM
  • REST programming model implemented as WCF services
  • AJAX services built with WCF for ASP.NET AJAX using JSON encoding

Curso de Introducción a WCF de Microsoft


¿Que es WCF?


Arquitectura de WCF


Introducción a WCF

Screencast
Creación de su primer servicio WCF

Screencast
Creación de su primer cliente WCF

Screencast
Configuración de servicios con extremos

Screencast
Configuración de referencias de servicios WCF

Screencast
Servicios WCF de autohospedaje

Screencast
Hospedaje de servicios WCF en IIS

Curso Completo de WCF de TutorialsPoint

Otro curso completo gratuito de TutorialsPoint que esta muy bien organizado y detallado para empezar a trabajar con WCF, se puede acceder a todo el curso sin necesidad de registrarse: https://www.tutorialspoint.com/wcf/index.htm

Curso Learning WCF RIA Services

Como explica Microsoft: “RIA services is a server-side technology that automatically generates client-side (Silverlight) objects that take care of the communication with the server for you and provide client-side validation. The main object inside a RIA service is a DomainService, usually a LinqToEntitiesDomainService that is connected to a LinqToEntities model.”

Si os encontrais con algún proyecto con esta tecnología aqui hay un pequeño curso para entender como funciona: https://debugmode.net/2011/08/01/learn-wcf-ria-service-day-1

 

Aplicación Completa con WCF

Por ultimo, como siempre lo mejor es disponer de una aplicación completa diseñada con WCF en los dos extremos (cliente y servidor) para tener una visión de como se implemente realmente y esta de Codeproject esta muy bien documentada.

Arquitectura propuesta:

  • Rich client using WPF
  • Client connects to server using WCF services
  • NHibernate, EF, RabenDB are used for persistence purposes
  • Client application can be run against in-memory repositories (Exploration Client)
  • Deployment of the exploration client must be kept simple
  • The application must be easily testable, tests can be run against any of the implemented repositories

Link: https://www.codeproject.com/Articles/87510/WCF-by-Example-Introduction

ACTUALIZACIÓN WCF

Debido a la aparición de ASP.NET WebApi y SignalR, actualmente no se recomienda seguir utilizando WCF para nuevos desarrollos.

Mas info: Say goodbye to WCF!!

Tampoco se recomienta usar WCF RIA Services: http://blogs.msmvps.com/deborahk/who-moved-my-cheese-ria-services/