Frage

Ich habe einen Web-Service von wsgen durch Maven erzeugt. Wenn ich den Dienst implementieren Glassfish legt es die Server-URL in die WSDL. Unser Server Glassfish wird von einem Apache-Proxy-Server konfrontiert.

Was das alles bedeutet, wenn jemand greift unsere WSDL und schaut auf den Service-Endpunkt und die Seife Adresse Lage sie sehen, ist

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

statt

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

Ich glaube, ich brauche eine Klarstellung auf ein paar Dinge ...

  1. Ist die Endpunkt-Adresse wichtig? Werden Kunden Funktion der Lage sein, nach wie vor, wenn die Endpunkt-Adresse nicht die URL des Proxy-Servers übereinstimmen werden sie den Dienst aufzurufen anrufen. Dies stellt im Grunde die Fragen " ist WSDL Web Service als Schnittstelle zum Objekt ".

      

    UPDATE: Als Reaktion auf diese erste Frage scheint es, dass " WSDL Web Service als Schnittstelle zu Objekt ". Die Endpunkt-Adresse in der WSDL angegeben ist nicht wichtig. In der Tat ist es relativ trivial, eine Web-Service-Operation auf einem anderen Endpunkt als der in der WSDL angegeben aufrufen wie hier beschrieben.

    // 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. Die WSDL wird automatisch generiert, wenn wir auf Glassfish bereitstellen. Gibt es eine einfache Möglichkeit, diese erzeugte Endpunktadresse in Glassfish über eine App-Server-Einstellung außer Kraft zu setzen. Wenn ja, kann ich eine Einstellung erstellen, um automatisch die Proxy-Server-URL in die generierte WSDL platzieren.

Wenn ein in der Tat wichtig ist, und wir können es nicht mit zwei in irgendeiner Weise außer Kraft setzen, dann im Grunde bedeutet es, wir tun müssen, um für die Entwicklung und Produktion getrennt baut. Dies gilt nicht „richtig anfühlt“, wie es mir scheint, das einzige, was wir auf einen anderen Server implementieren tun müssen, sollte eine bestehende (und getestet) Krieg von einer Umgebung auf den neuen Server fallen.

War es hilfreich?

Lösung

Es stellt sich heraus ein Server Name Parameter auf dem HTTP Listener ist, wo der Dienst bereitgestellt wird. Sie können diesen Wert aus der Glassfish-Administrationskonsole angeben und Glassfish diesen Namen anstatt die Hostnamen in der Anforderungs-URL verwenden.

Leider wird dieser Parameter erlaubt Ihnen nicht, den Port oder Protokoll (http auf https), wenn Ihre App-Server und Proxy-Server die gleichen, die nicht verwenden außer Kraft zu setzen (unsere nicht).

Was ich tat, war stattdessen schreiben Sie einen einfachen Servlet-Filter für meinen Dienst für mich zu handhaben.

Andere Tipps

Ich entdeckte, was ich für eine sehr einfache Art und Weise sein, sich mit der Frage zu befassen: Verwendung mod_substitute in Apache. Da die von uns mit diesem Problem bereits Apache verwendet wird, und es wird gebaut und einfach, mochte ich diesen Ansatz am besten.

Ich habe einen Block ähnlich wie die unten in einem meiner Apache conf Dateien und fand Freude:

<Location />
   AddOutputFilterByType SUBSTITUTE text/xml
   Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top