Pregunta

Tengo un servicio web generado por wsgen través experta. Cuando puedo implementar el servicio de Glassfish coloca la URL del servidor en el WSDL. Nuestro servidor Glassfish es liderada por un servidor proxy de Apache.

Lo que esto significa es cuando alguien accede a nuestra WSDL y miradas en el extremo de servicio y la ubicación de la dirección de jabón que ven es

http://app server url/service...

en lugar de

http://proxy server url/service...

Me parece que necesito algunas aclaraciones sobre algunos artículos ...

  1. Es importante que esta dirección de punto final? Serán los clientes todavía será capaz de funcionar si la dirección de punto final no coincide con la dirección URL del servidor proxy que estarán llamando a invocar el servicio. Esto básicamente hace las preguntas " es WSDL para el servicio web como interfaz es objeto ".

      

    ACTUALIZACIÓN: En respuesta a esta primera pregunta sí parece que " WSDL para el servicio web como interfaz es objeto ". La dirección de punto final especificado en el WSDL no es importante. De hecho, es relativamente trivial para invocar una operación de servicio web en un punto final diferente de la especificada en el WSDL como se describe aquí .

    // Create service and proxy from the generated Service class.
    HelloService service = new HelloService();
    HelloPort proxy = service.getHelloPort();
    
    // Override the endpoint address
    ((BindingProvider)proxy).getRequestContext().put(
            BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
            "http://new/endpointaddress");
    proxy.sayHello("Hello World!");
    

  2. El WSDL se genera automáticamente cuando hacemos uso de Glassfish. ¿Hay una manera fácil de anular esta dirección de punto final generado en Glassfish a través de un entorno de servidor de aplicaciones. Si es así, puedo crear un entorno para colocar automáticamente la dirección URL del servidor proxy en el WSDL generado.

Si 1 es realmente importante y no podemos anularlo en cualquier forma con 2, a continuación, que básicamente significa que tendremos que hacer construye separada para el desarrollo y la producción. Esto no se "siente bien", ya que me parece que lo único que hay que necesita hacer para implementar en otro servidor se deje caer una guerra existente (y probado) de un entorno en el nuevo servidor.

¿Fue útil?

Solución

Resulta que hay un parámetro Server Name en el HTTP Listener donde se implementa el servicio. Puede especificar este valor de la consola de administración de Glassfish y Glassfish va a utilizar este nombre en lugar del nombre de host en la URL de solicitud.

Por desgracia, este parámetro no permitirle hacer prevalecer el puerto o protocolo (http a https) si su servidor de aplicaciones y el servidor proxy no utilizan los mismos (la nuestra no lo hacen).

Lo que hice en cambio, fue escribir un simple filtro de servlet para mi servicio a manejar esto por mí.

Otros consejos

he descubierto lo que considero que es una manera muy simple para hacer frente a la cuestión: el uso mod_substitute en Apache. Desde aquellos de nosotros con este problema ya se está usando Apache, y está construido y sencilla, me ha gustado este enfoque mejor.

Me puso un bloque similar a la de abajo en una de mis archivos de configuración del Apache y encontró la alegría:

<Location />
   AddOutputFilterByType SUBSTITUTE text/xml
   Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top