2014-12-09 1 views
1

JAVA로 작성된 SOAP 서버에 문제가 있습니다.이 프로젝트는 웹 서비스 (예 : GLASSFISH)가 아닌 Windows 서비스로 실행됩니다. 그래서 문제는 C# .NET 클라이언트에서 요청할 때마다 JAVA SOAP 서버가 요청을 구문 분석 할 수 없다는 것입니다. 호출 된 함수는 입력 매개 변수로서 NULL 값을 가져옵니다.JAVA의 SOAP 서버 <-> C#의 SOAP 클라이언트

Java 클라이언트와의 통신, SoapUI, aso. 완벽하게 작동하지만 .NET (C#) 클라이언트는 내가 생각하는 maleformed 요청을 보내고 있습니다. 프로젝트가 이미 존재하고 많은 시간 동안 설치 되었기 때문에 C#으로 개발할 수 없습니다. 비슷한 문제가있는 스레드를 많이 읽었지만 제 경우에 대한 해결책을 찾지 못했습니다.

간단한 테스트 케이스를 작성하여 짧은 방법으로 문제를 표시했습니다.

자바 코드 :

main.java 
//... 
Endpoint endpoint = Endpoint.create(new WS()); 
endpoint.publish("http://0.0.0.0:8081/test"); 
//... 

WS.java 
//... 
@WebService(serviceName = "WS") 
@SOAPBinding(style = SOAPBinding.Style.RPC) 
public class WS { 
    @WebMethod(operationName = "echo") 
    public String echo(@WebParam(name = "val") String val) { 
     return val; 
    } 
} 

은 WSDL :

<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webj/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://webj/" name="WS"> 
<types/> 
<message name="echo"> 
    <part name="val" type="xsd:string"/> 
</message> 
<message name="echoResponse"> 
    <part name="return" type="xsd:string"/> 
</message> 
<portType name="WS"> 
    <operation name="echo"> 
     <input wsam:Action="http://webj/WS/echoRequest" message="tns:echo"/> 
     <output wsam:Action="http://webj/WS/echoResponse" message="tns:echoResponse"/> 
    </operation> 
</portType> 
<binding name="WSPortBinding" type="tns:WS"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/> 
    <operation name="echo"> 
     <soap:operation soapAction=""/> 
     <input> 
      <soap:body use="literal" namespace="http://webj/"/> 
     </input> 
     <output> 
      <soap:body use="literal" namespace="http://webj/"/> 
     </output> 
    </operation> 
</binding> 
<service name="WS"> 
    <port name="WSPort" binding="tns:WSPortBinding"> 
     <soap:address location="http://xxx:8081/test"/> 
    </port> 
</service> 

C#을 요청

,210

JAVA 요청 문제는 매개 변수 "발"의 namespave 것 같다

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:std="http://webj/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <std:echo> <val>TEST</val> </std:echo> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

:에 네임 스페이스를 추가하여

<echo xmlns="http://webj/"> 
    <val xmlns="http://webj/">TEST</val> 
</echo> 

이미 자바에서이 사건을 테스트 한 매개 변수 "val"수동으로 동일한 문제가 있습니다. C#에서는 생성 된 WebReferences 및 ServiceReferences를 사용해 보았습니다.

(예를 들어, ServiceReference)

TestService.WSClient proxy = new TestService.WSClient(); 
String results = proxy.echo("TEST"); 

내가 .NET 요청에 대한 자바 서버 호환하시기 바랍니다 얻을 수있는 방법 누군가가 말해 줄래? 도움 주셔서 감사합니다!

+0

SoapUI를 모형 서버로 사용하고 C# 코드를 보내는 것이 무엇인지 직접 확인하십시오. – JIV

+0

@ JIV C#이 위의 "C# 요청"을 보내고 있습니다 (자바 측에서 전송을 기록했습니다) –

+0

그리고 C#의 요청이 SoapUI에서 유효합니까? – JIV

답변

0

Java JDK 1.8을 사용하고 있습니까?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <s:Body> 
     <echo xmlns="http://webj/"> 
      <val xmlns="">TEST</val> 
     </echo> 
    </s:Body> 
</s:Envelope> 

자바 JDK 1.8 버그와 JAX-WS 버전이 포함되어 나는 C# .NET을 매개 변수에 대한 네임 스페이스를 보내고 있지만,이 같은 빈 공간을 보낼 생각하지 않기 때문에. C# 클라이언트 요청의 빈 네임 스페이스는 위의 C# 예제와 마찬가지로 완전히 잘못 해석됩니다.

newsest 버전 >JAX-WS<을 사용해보세요.

>Here< libs 구현 방법에 대한 설명을 찾을 수 있습니다.

+0

감사합니다. 내 주말을 저장했습니다. 자바 버전에서 문제가 발생했습니다. JDK 6 & 7에서 아무런 문제없이 테스트했습니다. 그 후 vmoptions와 함께 새로운 jax-ws 버전을 포함 시켰고 완벽하게 작동했습니다! 자바가 메시지를 기록하기 전에 들어오는 메시지를 조작하고있는 것으로 보입니다 ... –

0

네임 스페이스에서 문제가 발생 했으므로 java가 파싱 할 때 값을 찾지 못하고 그 이유 때문에 개체 값이 null이됩니다. C#에서 동일한 XML 구조를 가져 오십시오.

+0

답변 해 주셔서 감사합니다. 하지만 그게 내 다음 질문으로 이어집니다. C#에서 WebReference의 XML 구조를 편집하려면 어떻게해야합니까? –

+0

정확히 C#으로 어떻게 작동하는지 모르겠습니다. 예를 들어 Java에서는 @Annotation을 사용하여 원하는대로 네임 스페이스를 가져옵니다. C#에서 동일한 것을 찾으십시오. –