2011-05-22 19 views
5

Necesito cambiar algunos ajustes de configuración sobre la marcha en un proyecto de Windows Azure, y deben cambiarse a través de una llamada al servicio web (actualizando la configuración de la aplicación ya sea a través de la API de la plataforma o el sitio de Administración de Azure no es una opción aquí).Azure: Comunicación In-WebRole (netTcpBinding) con Full-IIS

El proyecto tiene múltiples roles de web y de trabajador, todos los cuales deberán conocer la nueva configuración cuando se modifique.

La configuración se conserva para el almacenamiento duradero, y también se almacena en caché durante el tiempo de ejecución en una variable estática.

Mi solución fue crear un punto final interno (tcp) en mis roles, y usarlo para recorrer todos los roles e instancias dentro de esos roles, crear un cliente sobre la marcha y decirle a la instancia sobre la nueva configuración . (Más o menos idéntico a: http://msdn.microsoft.com/en-us/gg457891)

Al principio comencé un ServiceHost en el RoleEntryPoint de WebRole ... y me confundí por qué todo parecía funcionar bien cuando pisaba las comunicaciones (las variables estáticas se ajustaban correctamente)) - sin embargo, cuando realizaba otras llamadas al servicio web, la variable estática parecía haber "olvidado" lo que le había asignado.

Este fue el caso tanto localmente como en el entorno de preparación de Azure.

En este punto me di cuenta de que, debido a que estamos usando el modo IIS completo, RoleEntryPoint y los servicios web se ejecutaban en dos procesos separados: uno en el resguardo de Azure y otro en IIS.

"No es un problema" Dije, simplemente moveré la línea de código que inicia el ServiceHost desde mi RoleEntryPoint al global.asax - en ese punto el ServiceHost se habrá iniciado en el mismo proceso que el resto del sitio - y las variables estáticas serían las mismas.

Aquí es donde tengo un problema; Esto funciona muy bien en mi máquina local ejecutándose en el entorno de desarrollo. Tan pronto como despliegue para la puesta en escena, empiezo a recibir correos electrónicos de error que dicen que el canal utilizado para conectarse al servicio no se puede cerrar porque está en "estado de error".

Pregunta:

  • Qué es diferente sobre Azure vs entorno de desarrollo que está causando esto?
  • ¿Cómo puedo solucionar el problema o solucionarlo?
  • ¿Alguien tiene algún consejo general sobre cómo debo obtener un error más descriptivo ... tengo que habilitar el diagnóstico wcf completo en Azure para obtener esto, o hay alguna otra forma en que puedo obtener los detalles de la excepción ?

de Seguimiento:

través de Escritorio remoto que he aprendido varias cosas interesantes:

  • Activación no HTTP no está instalado de forma predeterminada en Azure WebRoles. Creo que esto se puede superar mediante un script de inicio:

    start/w pkgmgr/iu: WCF-NonHTTP-Activation;

  • El sitio web creado en IIS por la función web no tiene habilitado el protocolo net.tcp por defecto.También creo que esto se puede superar con un script de inicio:

    % SystemRoot% \ system32 \ inetsrv \ appcmd.exe establecido aplicación "Sitio Web nombre aquí" /enabledProtocols:https,http,net.tcp

No he tenido tiempo para llevar esto hasta el final, ya que los plazos me han obligado a implementar algunas soluciones temporalmente.

Algunos enlaces útiles relacionados con este tema:

http://msdn.microsoft.com/en-us/magazine/cc163357.aspx

http://forums.iis.net/t/1160443.aspx

http://msdn.microsoft.com/en-us/library/ms731053.aspx

http://labs.episerver.com/en/Blogs/Paul-Smith/Dates/2008/6/Hosting-non-HTTP-based-WCF-applications-in-IIS7/

+0

No sé cuál es la solución a este problema, pero he encontrado algo que es muy similar: http://stackoverflow.com/questions/5956814/unable-to-host-a-service-bus- wcf-host-in-iis-on-azure – knightpfhor

Respuesta

1

ACTUALIZACIÓN (6/27/2011):

Sorprendentemente, alguien en Microsoft (cuyo blog comenté) en realidad me consiguió una respuesta sobre esto.

equipos El Azure & WCF actualizan este post:

http://blogs.msdn.com/b/windowsazure/archive/2011/06/27/hosting-services-with-was-and-iis-on-windows-azure.aspx

El enlace contiene toda la información que necesita para seguir adelante con esto.

Y un ENORME agradecimiento a Yavor Georgiev, el PM de MSFT con la victoria.


Ha sido bastante tiempo desde que he hecho la pregunta, y no hay respuestas, así que me dejo esto:

por mis seguimientos en el puesto, hay maneras de hacer este trabajo ... pero son complicados y difíciles de implementar.

Para WORKER ROLES, netTcpBinding funciona perfectamente. No hay problemas aquí. Adelante y úsalo.

Para WEB ROLES, tiene problemas. Pero netTcpBinding es lo que necesita para exponer puntos finales internos. ¿Qué hacer?

Bueno, esto es lo que hice:

  • servicio de inicio netTcpBinding en su RoleEntryPoint usando ServiceHost.
  • Crea el servicio WCF estándar en tu rol web usando SOAP/JSON/Lo que quieras.
  • Cuando reciba solicitudes a través de su netTcpBinding, deleguelas junto con el servicio WCF en el adaptador de bucle invertido.
  • Proteja adecuadamente su servicio WCF "interno" con certificados de cliente SSL.

No es perfecto ... pero funciona, y no es terrible.

Sospecho que la necesidad de hacer este tipo de cosas no es muy común, y realmente no puedo pensar en ninguna otra razón por la que necesites otra cosa que no sea modificar dinámicamente la configuración en tiempo de ejecución ... lo que significa que No critiquen estos servicios como locos.

Obviamente, YMMV.

0

yo tuvimos un tiempo miserable conseguir HTTP de trabajo entre instancias de puesta en escena, y se dio por vencido cuando parecía que necesitaba ensuciar alrededor con netsh para dar permiso a mis procesos para escuchar a través de un HttpListener (sheesh!). Así que cambié a TCP a través de sockets. HTTP simplemente agrega sobrecarga en un escenario de comunicación punto a punto como este.

+0

Quizás estoy confundido. Estoy usando netTcpBinding ... no HTTP. Usted dice que "cambió a TCP a través de sockets" ... ¿puede dar un ejemplo de cómo pudo hacer esto y que el ServiceHost interactúe con su aplicación .NET alojada en IIS? – Steve

+0

Probablemente debería haber publicado mi respuesta como un comentario, porque realmente solo estaba tratando de compartir cómo me comunico entre los roles. Comienzo un hilo en Application_Start dentro de Global.asax.cs. Utiliza la API de socket de bajo nivel para recibir mensajes de roles de trabajador, que también usan la API de sockets de bajo nivel. Lo que quiere decir, tal vez intente no usar WCF. –

Cuestiones relacionadas