Ir al contenido principal

Publicación de WCF en Net.TCP

Una de las grandes características de WCF es la forma en como éstos pueden ser expuestos a nuestros clientes, por ejemplo los siguientes protocolos, de manera muy recurrente:
  1. Http
  2. TCP
  3. Net Pipe
¿Sabes en que casos usar cada uno?
  1. Http cuando el servicio y el cliente se encuentran en redes diferentes
  2. TCP cuando el servicio y el cliente se encuentran en la misma red, pero en equipos diferentes
  3. Net Pipe cuando el servicio y el cliente se encuentran alojados en el mismo equipo
¿Por qué razón?

Por cuestiones de redimiento y seguridad de la información
  1. Si una petición http toma un tiempo de 200 ms, por poner un ejemplo
  2. Una petición tcp tomará aproximadamente el 20% menos que la petición http (40 ms aproximadamente)
  3. Y una petición Net Pipe, tomará aproximadamente el 80% del tiempo que toma el hacer una petición tcp (32 ms aproximadamente)
Para mayor entendimiento, chequen este post que alguna vez consultamos para entender un poco más acerca de éstos conceptos: https://jtorresrivera.wordpress.com/2012/06/14/diferencias-de-rendimiento-entre-wcf-binding-http-tcp-and-net-pipe/

En este post aprenderemos a publicar un servicio WCF usando NetTcpBinding y mexTcpBinding

Veamos el video que preparamos para validar el funcionamiento de lo que queremos obtener:



Validando los Requisitos Previos de Nuestro Servidor

Características de Windows

Validemos que las siguientes características de Windows se encuentren instaladas en nuestro servidor, si ya cuenta con la versión 4.6 del .NET Framework, asegúrate de tener instaladas las características correspondientes a: Servicios Avanzados de .NET Framework 4.6

Para esto, vaya al Panel de Control, Programas y después en Activar o Desactivar las características de Windows.

Herramienta de Registro de ASP.NET en IIS

Ejecute el siguiente comando desde el símbolo del sistema con privilegios de administrador, en caso de tener IIS instalado en un sistema operativo anterior a Windows 8 o Windows Server 2012:

%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis -i

Validación de Servicios Iniciados 

Ingrese al Panel de Control, Herramientas Administrativas y por último en Servicios para validar que los siguientes servicios se encuentran iniciados:
  1. Adaptador de escucha Net.Msmq
  2. Adaptador de escucha Net.Pipe
  3. Adaptador de escucha Net.Tcp 


Creación de un Sitio Para la Publicación de Servicios Sobre TCP

Este paso es opcional, puesto que puedes llevar a cabo la publicación en el sitio web predeterminado o en cualquier otro existente, tú decides como trabajarlo.

Ingresa al Panel de Control, Herramientas Administrativas y por último en Administrador de Internet Information Services.

Para crear el nuevo sitio, haz clic derecho sobre Sitios y posteriormente en: Agregar sitio web.



Configura los siguientes parámetros en tu sitio:
  1. Nombre del sitio: En nuestro ejemplo: Servicios
  2. Grupo de aplicaciones: Te recomendamos usar el grupo de aplicaciones con el Framework más actual con el que cuentes, para nuestro caso: .NET v4.5
  3. Ruta de acceso física: Elige la que mejor te convenga, para nuestro ejemplo usaremos: C:\inetpub\Servicios
  4. El enlace principal a configurar será: http y el puerto de tu elección, el segundo más común por default después del 80 es el 8080 que será el elegido para nuestro ejemplo.

Ahora crearemos un nuevo enlace para el sitio recién creado seleccionándolo y posteriormente haciendo clic en la opción: Enlaces


Agregaremos un nuevo enlace, seleccionando como tipo del mismo: net.tcp y en cuanto a la información del enlace escribiremos: 808:* que significa que todas las peticiones de tipo net.tcp solicitadas por el puerto 808 serán resueltas por este enlace. 

Publicación del Servicio WCF

Descargue el código fuente al final del post y copie la publicación dentro de la carpeta asignada en el sitio web que recién creamos, en nuestro ejemplo en C:\inetpub\Servicios\CalcService


Vuelva al Administrador de Internet Information Services y haga clic derecho sobre el sitio Servicios y posteriormente en la opción: Actualizar



Expanda el sitio Servicios y verá la carpeta que acabamos de copiar en la carpeta asociada al sitio y después haga clic derecho sobre ella y seleccione la opción: Convertir en aplicación.


No necesitas configurar nada más, sólo haga clic en Aceptar



Por último habilitaremos el protocolo net.tcp haciendo clic sobre la aplicación recién creada: CalcService, en la parte derecha ubicaremos la opción de Configuración avanzada... y en la sección de Comportamiento, en Protocolos habilitados deberá estar configurado como: http, net.tcp.



Abre el navegador de tu preferencia y si seguiste las instrucciones basadas en nuestro ejemplo deberías visualizar algo como en la imagen siguiente al escribir en la barra de direcciones: http://localhost:8080/CalcService/CalcService.svc


Archivo de Configuración

Para que todo esto funcione el archivo de configuración deberá lucir como el que a continuación te mostramos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="CalcService.CalcService">
        <endpoint address="" binding="netTcpBinding" contract="CalcService.ICalculator" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:808/CalcService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Pon especial atención en lo que se encuentra dentro de la etiqueta system.serviceModel, en especial en la parte de behavior que inhabilita el devolver los metadatos del servicio por http y https.

La parte de baseAddress debe coincidir con la ruta en la que el servicio se encuentra a la escucha: net.tcp://localhost:808/CalcService

Agregar la Referencia de Servicio en un Cliente

Puedes descargar el código fuente de una aplicación cliente Windows Forms desde la que podrás probar el consumir el servicio usando el protocolo Net.Tcp. La aplicación se llama: Client.sln


Una vez abierto el proyecto haz clic derecho sobre el proyecto Windows Forms llamado Client, posteriormente en la opción Agregar y por último en la opción: Referencia de Servicio.

Considera la siguiente configuración: la dirección que usaste para publicar el servicio en el Administrador de Internet Information Services; a lo largo de este ejemplo ha sido: net.tcp://localhost:8080/CalcService/CalcService.svc/mex y el nombre del espacio de nombres deberá ser CalcService, puesto que la aplicación de cliente está configurada para hacer referencia a ese espacio de nombres.

Descarga de Código Fuente

La descarga incluye los siguientes elementos:
  1. Solución con el servicio a publicar: CalcService
  2. Cliente para llevar a cabo tus pruebas: Client
Acabamos de migrar a Visual 2017, por lo que ya nos encontramos trabajando en el Framework 4.5.2, descarga la versión Community para que lleves a cabo tus pruebas desde este link: VSCommunity2017

Comentarios

Entradas más populares de este blog

Validación de Fechas con jQuery Validator

Al validar fechas con jQuery Validate nos encontramos con el problema de que dicha validación se hace en formato: MM/DD/YYYY, esto es correcto, pero no tanto para formato de fechas de México al menos que es más común para nosotros hacerlo de manera que dicho formato sea: DD/MM/YYYY. Para poder solucionar este problema haremos algunas modificaciones en las librerías: jquery.validate.js jquery.validate.min.js Veamos el siguiente video para la implementación de dicha solución: jquery.validate.js Se deja comentado el cómo se hace la validación original y se adiciona el código personalizado que permite validar el formato de fecha del tipo: DD/MM/YYYY 1 2 3 4 5 6 7 8 9 10 11 // http://jqueryvalidation.org/date-method/ // Nivisix Soluciones: personalización para formato de fechas DD/MM/YYYY date : function ( value, element ) { //return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); var com...

SQLServer Stored Procedure Para Ordenar Columnas Ascendente / Descendente

Pues este es nuestro primer post referente a SQLServer ... En primera instancia les queremos platicar qué es lo que buscamos:  Mediante un stored procedure obtener un listado ordenado por alguna de las columnas devueltas de manera ascendente o descendente, dependiendo de los parámetros de entrada del mismo. Muchas de las ocasiones cuando nos ha tocado buscar información acerca de cómo hacer este proceso, solemos encontrar recomendaciones de hacerlo usando un query que se contruye en tiempo de ejecución usando una variable de tipo VARCHAR(MAX) y después hacer uso de la función EXEC para ejecutarlo. Al final, se resuelve el problema, pero la intención es mejorar el procedimiento sin afectar el rendimiento y evitando problemas de seguridad como el SQL Injection . Veamos un video con una propuesta diferente de resolución de este requerimiento: Creación de la Base de Datos Usando el siguiente query que pueden ejecutar en el cliente base de datos SQL Server creare...