Чому сервер звітів вебсервісу, який викликає C#, не розпізнає значення заголовка SOAPAction і завжди дозволяє C# змінювати його, лише тому, що C# потрібно додати лише тег, чому JAVA не може вказати запит на дію?
Публікація та дзвінок у веб-сервіс дуже прости, але все ж існують незначні проблеми, які підсумовуються так:
Java викликає веб-сервіс .net з помилкою «Server failed to authored the value of HTTP header SOAPAction».
Рішення:
Під час виклику вебсервісу SoapAction не вказано, RequestNameSpace не вказано, тому при запиті завжди з'являється «Сервер не розпізнав значення HTTP-заголовка SOAPAction».
Якщо використовуєте виклики Axis, викликайте їх так:
public static void main(String[] args) викидає Exception { Не принести? Суфікс WSDL Кінцева точка рядка = "http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx"; Створіть сервісний дзвінок Service service = new Service(); Створіть об'єкт виклику через сервіс Call call = (Call) service.createCall(); Встановіть URL, де розташований сервіс call.setTargetEndpointAddress (new java.net.URL(endpoint)); qqCheckOnline — це метод "http://WebXml.com.cn/" на стороні мережі, який також звертає увагу на адресу простору імен і повідомляє про помилку, якщо ви його не принесете call.setOperationName (новий QName("http://WebXml.com.cn/","qqCheckOnline")); qqCode також є назвою параметра методу .NET, який є назвою параметра qqCheckOnline call.addParameter (новий QName("http://WebXml.com.cn/","qqCode"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); Уникайте виклику Java до веб-сервісу .net з помилкою «Сервер не розпізнав значення HTTP-заголовка SOAPAction» call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING); Тип поверненого параметра call.setSOAPActionURI("http://WebXml.com.cn/qqCheckOnline"); Варто також зазначити, що потрібно додати метод, який буде викликаний, інакше також буде зафіксована помилка Масиви об'єктів інкапсулюють параметри String ret = (Рядок) call.invoke(new Object[] {"aaaaaa"}); System.out.println("--------"+ret); } Зверніть увагу на розділ коментарів.
Вхід за гіперпосиланням видно.? WSDL розшифровується як Public Web Service
Наступний виняток виникає, коли wsdl2java.bat з використанням CXF генерує клієнта для публікації .net вебсервісу на основі wsdl-файлу
(оголошення невизначеного елемента 's:schema') Рішення:
Відкрийте wsdl.xml і використовуйте
<s:будь-який minOccurs="2" maxOccurs="2"/>Alternate <s:element ref="s:schema" /><s:any /> Ця помилка генерації wsdl2java має бути пов'язана з тим, що JAXB не підтримує xml-посилання, оскільки <s:any minOccurs="2" maxOccurs="2"/> та <s:element ref="s:schema" /><s:any/> фактично еквівалентні. <s:element ref="s:schema" /> фактично означає, що ви можете використовувати будь-який тип елементів, заданий s:schema тут, <s:any /> виконує цю роль, <s:any minOccurs="2" maxOccurs="2"/> — це просто два <s:any /> Це було написано в одному реченні.
ПосиланняВхід за гіперпосиланням видно.
Використання CXF wsdl2java.bat генерує суперпомилку компіляції клієнта на основі файлу wsdl
Рішення:
Вона не компілюється належним чином, оскільки специфікація jax-ws2.2 конфліктує з java6.
Однак програму не можна скомпілювати лише в java5, тому необхідно знизити версію специфікації jax-ws, яку можна зробити так: Виконати команду
WSDL2Java -frontend jaxws21 -client *.xml Таким чином, код, згенерований за допомогою jax-ws2.1, можна скомпілювати та виконувати на java6.
Я порівняв клієнтський код, згенерований інструментом, з текстовим порівнянням і виявив, що останній генерує ще 3 клієнтські коди, тому видалення трьох конструкторів, які повідомляли про помилки, також може вирішити вищезазначені проблеми.
Перевидано з:Вхід за гіперпосиланням видно.
|