Dlaczego serwer raportujący usługi sieciowej, który wywołuje C#, nie rozpoznaje wartości nagłówka http SOAPAction i zawsze pozwala C# ją zmieniać? Tylko dlatego, że C# musi dodać tylko tag, dlaczego JAVA nie może określić żądania akcji?
Publikowanie i wywoływanie Webservice jest bardzo proste, ale wciąż występują drobne problemy, które podsumowano następująco:
Java wywołuje usługę webową .net z błędem "Serwer nie rozpoznał wartości nagłówka HTTP SOAPAction".
Rozwiązanie:
Podczas wywoływania usługi webowej nie jest określana żadna SoapAction, nie jest określana przestrzeń RequestNameSpace, więc "Serwer nie rozpoznał wartości nagłówka HTTP SOAPAction" zawsze pojawia się podczas żądania.
Jeśli używasz wywołań Osi, wywołaj je następująco:
public static void main(String[] args) rzuca Exception { Nie przynosisz? Przyrostek WSDL Koniec ciągu = "http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx"; Utwórz połączenie serwisowe Usługa = nowa usługa(); Utwórz obiekt wywołania przez usługę Wywołanie wywołania = (Wywołanie) service.createCall(); Ustaw adres URL, gdzie znajduje się usługa call.setTargetEndpointAddress(new java.net.URL(endpoint)); qqCheckOnline to metoda "http://WebXml.com.cn/" po stronie sieci, która również zwraca uwagę na adres przestrzeni nazw i zgłasza błąd, jeśli jej nie wyświetlisz call.setOperationName(new QName("http://WebXml.com.cn/","qqCheckOnline")); qqCode to także nazwa parametru metody .NET, która jest nazwą parametru qqCheckOnline call.addParameter(new QName("http://WebXml.com.cn/","qqCode"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); Unikaj wywoływania usługi webService .net przez Javę z błędem "Serwer nie rozpoznał wartości nagłówka HTTP SOAPAction" call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING); Typ parametru zwracanego call.setSOAPActionURI("http://WebXml.com.cn/qqCheckOnline"); Należy również zauważyć, że trzeba dodać metodę, którą ma się wywołać, bo inaczej zostanie zgłoszony błąd Matryce obiektów enkapsulują parametry String ret = (String) call.invoke(new Object[] {"aaaaa"}); System.out.println("--------"+ret); } Zwróć uwagę na sekcję komentarzy.
Logowanie do linku jest widoczne.? WSDL oznacza Public Web Service
Następujący wyjątek występuje, gdy wsdl2java.bat korzystający z CXF generuje klienta do publikacji usługi sieciowej .net opartej na pliku wsdl
( deklaracja nieokreślonego elementu 's:schema') Rozwiązanie:
Otwórz wsdl.xml i użyj
<s:any minOccurs="2" maxOccurs="2"/>Alternate <s:element ref="s:schema" /><s:any /> Ten błąd generowania wsdl2java powinien być związany z tym, że JAXB nie obsługuje xml refs, ponieważ <s:any minOccurs="2" maxOccurs="2"/> oraz <s:element ref="s:schema" /><s:any/> są w rzeczywistości równoważne. <s:element ref="s:schema" /> oznacza, że możesz użyć dowolnego typu elementu określonego przez s:schema tutaj, <s:any /> pełni tę rolę, <s:any minOccurs="2" maxOccurs="2"/> to po prostu dwa <s:dowolny /> Było to napisane w jednym zdaniu.
odniesienieLogowanie do linku jest widoczne.
Użycie wsdl2java.bat CXF generuje superbłąd kompilacji klienta na podstawie pliku wsdl
Rozwiązanie:
Nie kompiluje się poprawnie, ponieważ specyfikacja jax-ws2.2 koliduje z java6.
Jednak program nie może być kompilowany wyłącznie w java5, dlatego konieczne jest obniżenie wersji specyfikacji jax-ws, którą można obsłużyć w następujący sposób: Wykonaj polecenie
WSDL2Java -frontend Jaxws21 -client *.xml W ten sposób kod wygenerowany w jax-ws2.1 może być kompilowany i wykonywany w java6.
Porównałem kod klienta generowany przez narzędzie z porównaniem tekstu i stwierdziłem, że to drugie generowało 3 dodatkowe kody klienckie, więc usunięcie 3 konstruktorów zgłaszających błędy może również rozwiązać powyższe problemy.
Przedruk z:Logowanie do linku jest widoczne.
|