تجاوزت الأسماك الزجاجية التي تم إنشاؤها عنوان نقطة نهاية خدمة WSDL

StackOverflow https://stackoverflow.com/questions/2142924

سؤال

لدي خدمة ويب تم إنشاؤها بواسطة WSGen عبر Maven. عندما أقوم بنشر الخدمة إلى Glassfish ، فإنه يضع عنوان URL الخادم في WSDL. يتم تواجد خادم Glassfish الخاص بنا بواسطة خادم وكيل Apache.

ما يعنيه كل هذا هو عندما يصل شخص ما إلى WSDL لدينا وينظر إلى نقطة نهاية الخدمة وموقع عنوان الصابون الذي يرونه

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

بدلاً من

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

أعتقد أنني بحاجة إلى بعض التوضيح على بعض العناصر ...

  1. هل عنوان نقطة النهاية هذا مهم؟ هل سيظل العملاء قادرين على العمل إذا كان عنوان نقطة النهاية لا يتطابق مع عنوان URL لخادم الوكيل الذي سيتصلون به لاستدعاء الخدمة. هذا يسأل بشكل أساسي الأسئلة "هل WSDL لخدمة الويب كواجهة هي الكائن".

    تحديث: رداً على هذا السؤال الأول ، يبدو أنه "WSDL إلى خدمة الويب كواجهة هي الكائن". عنوان نقطة النهاية المحدد في WSDL ليس مهمًا. في الواقع ، من التافهة نسبيًا استدعاء عملية خدمة ويب على نقطة نهاية مختلفة عن تلك المحددة في WSDL كما هو موضح هنا.

    // 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. يتم إنشاء WSDL تلقائيًا عندما ننشر في Glassfish. هل هناك طريقة سهلة لتجاوز عنوان نقطة النهاية التي تم إنشاؤها في Glassfish من خلال إعداد خادم التطبيق. إذا كان الأمر كذلك ، فيمكنني إنشاء إعداد لوضع عنوان URL لخادم الوكيل تلقائيًا في WSDL الذي تم إنشاؤه.

إذا كان 1 مهمًا بالفعل ولا يمكننا تجاوزه بأي شكل من الأشكال مع 2 ، فهذا يعني بشكل أساسي أننا سنحتاج إلى بنيات منفصلة للتطوير والإنتاج. هذا لا يشعر "على صواب" كما يبدو لي أن الشيء الوحيد الذي يجب أن نفعله للنشر على خادم آخر هو إسقاط حرب موجودة (واختبارها) من بيئة واحدة إلى الخادم الجديد.

هل كانت مفيدة؟

المحلول

اتضح أن هناك Server Name المعلمة على HTTP Listener حيث يتم نشر الخدمة. يمكنك تحديد هذه القيمة من وحدة تحكم إدارة Glassfish وسيستخدم Glassfish هذا الاسم بدلاً من اسم المضيف في عنوان URL للطلب.

لسوء الحظ ، لن تسمح لك هذه المعلمة بتجاوز المنفذ أو البروتوكول (HTTP إلى HTTPS) إذا كان خادم التطبيق وخادم الوكيل لا يستخدمان نفس الجهاز (لا يفعل ذلك).

ما فعلته بدلاً من ذلك كان اكتب مرشح Servlet بسيط لخدمتي للتعامل مع هذا من أجلي.

نصائح أخرى

لقد اكتشفت ما أعتبره طريقة بسيطة للغاية للتعامل مع المشكلة: استخدم mod_substitute في Apache. نظرًا لأن أولئك الذين يعانون من هذه المشكلة يستخدمون بالفعل Apache ، وهو مدمج وبسيط ، أحببت هذا النهج بشكل أفضل.

وضعت كتلة مماثلة للأسفل في أحد ملفات Apache Conf ووجدت الفرح:

<Location />
   AddOutputFilterByType SUBSTITUTE text/xml
   Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top