none
2 servicios net.tcp en el mismo puerto. RRS feed

  • Pregunta

  • Hola a todos,

    Estoy tratando de levantar 2 servicios WCF por net.tcp sobre el IIS, los 2 servicios están en el mismo puerto y cuando se levanta el segundo de ellos me da un error en el que me indica que el puerto ya esta ocupado por otro proceso. Si paro el primer servicio WCF el segundo se levanta sin problemas. Por lo tanto el servicio que tenia el puerto ocupado era el primero

    La duda que me surge es la siguiente: tengo que configurar los servicios en distinto puerto o puedo cambiar algo en la configuración para que los dos servicios WCF puedan compartir el mismo puerto?

    Muchas gracias de antemano, un saludo


    Daniel Simal

    miércoles, 30 de mayo de 2018 23:22

Todas las respuestas

  • Debe usar dos puertos diferentes, o bien usar lo que yo le llamo vanity names.  IIS puede usar el mismo puerto para múltiples sitios web siempre y cuando tengan distintos vanity names.  Un vanity name es un nombre en DNS.  Por ejemplo, el servidor web de http://www.microsoft.com NO se llama www.microsoft.com.  No sé cómo se llama, pero no es así.  www.microsoft.com es el vanity name, que es un nombre definido en DNS que apunta al servidor web.

    Entonces IIS puede tener múltiples sitios web siempre y cuando cada sitio web tenga un vanity name diferente.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 0:10
  • Hola,

    Como bien dices, tengo dominios distintos en cada uno de los bindings de cada uno de los servicios, en el primero de ellos tengo el siguiente binding (hago incapie en que el protocolo es net.tcp): 809:servicio1.example.com y en el segundo de ellos 809:servicio2.example.com. No me gustaría tener que abrir tantos puertos como servicios tenga y por extensión darle a cada uno de los servicios un puerto distinto.

    Un saludo,


    Daniel Simal

    jueves, 31 de mayo de 2018 19:31
  • Nótese que IIS tiene esta capacidad; si su host no es IIS, está limitado a un puerto por servicio, o bien programe un host que pueda rutear al servicio correcto dependiendo del vanity name, pero nótese que el vanity name es de fácil acceso para IIS pues viene explícito en la petición.  En su caso, el vanity name perfectamente puede haberse perdido después de resolver DNS.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 19:50
  • Hola,

    Voy a recapitular un poco, tengo una aplicacion web MVC (HTTP) alojada sobre IIS, esta aplicación web tiene una referencia a un servicio WCF compilado como un EXE. Este servicio WCF es duplex además debe invocarse a traves de internet y, por lo tanto, no puede ser sobre HTTP ya que la sesion HTTP podría expirar y no garantizarse las llamadas del contrato callback.

    Para levantar el servicio WCF, dentro del Global.asax tengo esto:

    ServiceHost WCFService = new ServiceHost(new WCFService(new RemoteCall()));
    WCFService.Open();

    Si levanto una instancia de la aplicacion no hay ningun problema, todo funciona de forma correcta, sin embargo, si levanto dos instancias de la aplicacion dentro del mismo IIS, cuando accedo a la segunda instancia de la aplicacion por HTTP, me aparece este mensaje de error. (Aclaro: intento acceder a la segunda instancia de la aplicacion por HTTP desde el mismo host donde esta el IIS para no tener que habilitar los errores remotos)

    Por si sirve de ayuda, los dos sitios web comparten el mismo puerto para HTTP (puerto 80), pero tienen distinto subdominio, servicio1.example.com para la primera instancia y servicio2.example.com para la segunda instancia. Del mismo modo que con HTTP, para el protocolo net.tcp tengo estos bindings, 809:servicio1.example.com para la primera instancia y 809:servicio2.example.com para la segunda instancia.

    Si cambio el binding de la segunda instancia y, pasa de 809:servicio2.example.com a 810:servicio2.example.com, la aplicación se levanta sin problemas y, por supuesto, el error desaparece, y es accesible tanto por HTTP como por net.tcp.

    ¿Alguna recomendación, para poder levantar las dos instancias sobre el mismo puerto sobre el protocolo net.tcp?

    Un saludo,


    Daniel Simal


    jueves, 31 de mayo de 2018 20:59
  • Yo hubiera hecho del servicio WCF un servicio de Windows.  Así el sitio web no tiene la necesidad de correrlo, y un único servicio de Windows puede servir a ambos sitios web en el mismo puerto.

    Tal y como lo tiene ahora, WCF no está alojado en IIS y por lo tanto necesita un puerto distinto para cada uno o bien crear su propio cascarón para el WCF que de alguna manera pudiera distinguir las llamadas, pero la complicación de esta ruta es sumamente grande comparado a los beneficios.  Yo no lo intentaría.

    Si es por el session timeout que no configura WCF en IIS, le recuerdo que el web.config puede cambiar el timeout al valor que usted guste, pudiendo entonces hacerlo un valor suficientemente grande para que le dé seguridad.  No me parece que esta razón sola sea razón suficiente para descartar IIS como host del WCF.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 21:05
  • Hola,

    Los servicios WCF sí estan con el IIS como host. En la siguiente imagen se puede ver que proceso está utilizando el puerto 809, en este caso el PID del proceso es el 5524, si hacemos la consulta de la lista de procesos y filtramos por el PID 5524 podemos ver como es el proceso w3wp.exe el que está usando el puerto 809, por lo tanto, a partir de esto podemos decir que sí se están ejecutando con el IIS como host.

    Por otra parte, la idea de descartar utilizar el servicio de windows es debido a que cada una de la instancias debe atacar a una base de datos distinta, que ademas coincide con la base de datos a la que ataca cada una de las instancias de la aplicacion web.

    Comentar tambien, que lo de descartar el protocolo HTTP para los servicios WCF además del rendimiento como se puede ver en las siguientes imagenes, es por que el tiempo que debe durar la sesion es indeterminado. Puede ser desde un día hasta más de un mes en casos extremos...

    Un saludo,


    Daniel Simal

    jueves, 31 de mayo de 2018 21:26
  • Sí, pero a su manera, que no permite la distinción por vanity name.  Si usted publica el WCF como un sitio web más en IIS y lo consume desde ambos sitios, ambos sitios pueden usar el mismo, o si así lo prefiere o lo necesita, puede publicar 2 copias del mismo WCF como sitios web distintos en IIS con sus propios vanity names y entonces un sitio web cliente puede consumir uno de los WCF's, y el otro consume el otro.  Un total de 4 sitios web en IIS:  2 clientes y 2 WCF's.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 21:54