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!!

 

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: Escenarios de Seguridad con Certificados y Https

https://santimacnet.files.wordpress.com/2010/12/wcf-logo.png

Si trabajamos en proyectos con WCF, certificados y https tanto desde el lado servidor con Windows Server 2008/IIS para instalar el certificado, como desde el lado cliente para consumirlo con WCF, SOAP, WSDL, existe una gran complejidad y variedad de opciones para definir y configurar el tema de los certificados y las llamadas https para securizar las aplicaciones, el motivo de este post es precisamente dejar los enlaces que han sido utiles para entender los diferentes escenarios posibles que encontramos aplicables a WCF.

La información esta disponible en Microsoft Docs, detalles de WCF, pero ya sabemos que hasta llegar al recurso se pierde mucho tiempo buceando por Google.

Escenarios de seguridad

La lista de los escenarios de seguridad que podemos encontrar son:

Cliente y servicio de Internet no protegidos
Un ejemplo de un cliente y servicio público y no protegido.

Cliente y servicio de intranet no protegidos
Un servicio básico de WCF desarrollado para proporcionar información sobre una red privada segura a una aplicación WCF.

Seguridad del transporte con la autenticación básica
La aplicación permite a los clientes iniciar sesión al utilizar autenticación personalizada.

Seguridad del transporte con la autenticación de Windows
Muestra un cliente y servicio protegidos por seguridad de Windows.

Seguridad del transporte con clientes anónimos
Este escenario utiliza la seguridad de transporte (como HTTPS) para garantizar la confidencialidad y la integridad.

Seguridad del transporte con autenticación de certificados
Muestra a un cliente y servicio protegidos por un certificado.

Seguridad de mensajes con clientes anónimos
Muestra un cliente y el servicio protegido por el modo de seguridad de WCF.

Seguridad de mensajes con un cliente de nombres de usuario
El cliente es una aplicación de Windows Forms que permite a los clientes iniciar sesión al utilizar un nombre de usuario y contraseña del dominio.

Seguridad de mensajes con un cliente de certificado
Los servidores tienen certificados y cada cliente tiene un certificado. Un contexto de seguridad se establece a través de la negociación de Seguridad de la capa de transporte (TLS).

Seguridad de mensajes con un cliente de Windows
Una variación del cliente del certificado. Los servidores tienen certificados y cada cliente tiene un certificado. Un contexto de seguridad se establece a través de la negociación de TLS.

Seguridad de mensajes con un cliente de Windows sin negociación de credenciales
Muestra un cliente y el servicio protegidos por un dominio de Kerberos.

Seguridad de mensajes con certificados mutuos
Los servidores tienen certificados y cada cliente tiene un certificado. El certificado de servidor se distribuye con la aplicación y está disponible fuera de banda.

Seguridad de mensajes con tokens emitidos
La seguridad federada que permite el establecimiento de confianza entre dominios independientes.

Subsistema de confianza
Un cliente obtiene acceso a uno o varios servicios Web distribuidos a través de una red. Los servicios Web tienen acceso a recursos adicionales (como bases de datos u otros servicios Web) que se deben proteger.

Ejemplo WCF

Un ejemplo de ayuda que ha sido util para el proyecto lo encontramos aqui: Implementing a WCF Client with Certificate using Windows Certificate Store

Para finalizar

Los escenarios están muy bien explicados y documentados, incluso encontramos los diagramas de cada uno, esto sin duda, nos ayuda con el analisis y definición del mejor escenario adaptado a las necesididades de nuestro proyecto.

Nos leemos!!

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/