Как использовать веб-сервис .NET в Netbeans, который имеет заголовок мыльной аутентификации - PullRequest
1 голос
/ 03 января 2011

Я пытаюсь использовать веб-сервис, созданный в .NET, который требует аутентификации SOAP. Та часть, которая вас больше всего заинтересовала бы, такова:

<s:element name="SoapAuthenticationHeader" type="tns:SoapAuthenticationHeader" /> 
      <s:complexType name="SoapAuthenticationHeader"> 
        <s:sequence> 
          <s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string" /> 
          <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" /> 
        </s:sequence> 
        <s:anyAttribute /> 
      </s:complexType> 

Я могу успешно использовать веб-сервис в Netbeans. Но я не могу использовать его, потому что в автоматически генерируемых заглушках / методах я не могу указать имя пользователя и пароль для аутентификации.

Автоматически сгенерированная заглушка Netbeans включает следующее для:

JAX-WS

try { // Call Web Service Operation
            org.tempuri.TeleCast service = new org.tempuri.TeleCast();
            org.tempuri.TeleCastSoap port = service.getTeleCastSoap();
            // TODO initialize WS operation arguments here
            int campaignid = 0;
            java.lang.String to = "";
            java.lang.String from = "";
            java.lang.String subject = "";
            java.lang.String body = "";
            java.lang.String uniqueid = "";
            // TODO process result here
            boolean result = port.queueRealTimeEmail(campaignid, to, from, subject, body, uniqueid);
            System.out.println("Result = "+result);
        } catch (Exception ex) {
            // TODO handle custom exceptions here
        }

JAX-RPC

try { // This code block invokes the TeleCastSoap:queueRealTimeEmail operation on web service
            telecastclient.TeleCast teleCast = new telecastclient.TeleCast_Impl();
            telecastclient.TeleCastSoap teleCastSoap = teleCast.getTeleCastSoap();
            teleCastSoap.queueRealTimeEmail(/* TODO enter operation arguments*/);
        } catch(javax.xml.rpc.ServiceException ex) {
            java.util.logging.Logger.getLogger(telecastclient.TeleCast.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch(java.rmi.RemoteException ex) {
            java.util.logging.Logger.getLogger(telecastclient.TeleCast.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch(Exception ex) {
            java.util.logging.Logger.getLogger(telecastclient.TeleCast.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

По крайней мере, когда я использую метод JAX-WS, я получаю класс с именем SoapAuthenticationHeader, в котором я могу установить имя пользователя и пароль. Но я не знаю, как передать этот объект SoapAuthenticationHeader до или во время вызова веб-службы для выполнения различных операций.

org.tempuri.SoapAuthenticationHeader auth = new SoapAuthenticationHeader();
            auth.setUsername("username");
            auth.setPassword("password");

У меня нет этой опции в методе JAX-RPC.

Буду признателен за любые материалы по этому вопросу. Заранее спасибо за ваше время.

1 Ответ

0 голосов
/ 05 января 2011

Похоже, что нет элегантного способа сделать это из IDE Netbeans по умолчанию.

Я пытался сделать то же самое с Eclipse, и во всех моих поисках меня приводили к этому Apache Axis2 -Руководство по генератору кода для подключаемого модуля Eclipse для Eclipse (я по-прежнему не могу публиковать ссылки, поскольку я новичок).

При использовании указанного выше подключаемого модуля (какое-то дополнение для затменияWSDL2Java), он генерировал заглушки вместе с надлежащими объектами SoapAuthenticationHeader, которые я могу передать для проверки.

Итак, мой код теперь:

TeleCastStub stub = new TeleCastStub();

SoapAuthenticationHeader auth = new SoapAuthenticationHeader();
auth.setUsername(username);
auth.setPassword(password);

QueueRealTimeEmail pageObj = new QueueRealTimeEmail();
pageObj.setFrom(from);
pageObj.setTo(to);
pageObj.setSubject(subject);
pageObj.setBody(body);

SoapAuthenticationHeaderE authE = new SoapAuthenticationHeaderE();
authE.setSoapAuthenticationHeader(auth);

QueueRealTimeEmailResponse response = stub.queueRealTimeEmail(pageObj, authE);

Работает просто отлично.

Теперь это приводит меня к еще нескольким вопросам:

  1. То, как я это сделал, с помощью плагина axis2, моего фрагмента кода, это правильный способ сделать это?Иногда у меня возникает ощущение, что я просто собираю хакерскую работу, чтобы выполнить свою работу, и мне всегда интересно найти правильный способ сделать что-то, чтобы я мог сделать это лучше в следующий раз.
  2. Когда я использовалвстроенный мастер генерации кода с eclipse, я заметил, что у него есть опция для времени выполнения Axis, а не Axis2.Итак, теперь мой вопрос;В более старых версиях Axis или с предварительно созданными инструментами IDE использование веб-сервисов со специальными заголовками аутентификации просто невозможно?Это больше архитектурное ограничение?

И еще раз спасибо за ваше время.

Отличная доска, ТАК!Спасла мою шкуру много раз.Так что теперь моя очередь возвращать сообществу.

...