2008-09-15 2 views
10

Java (다른 사람이 작성한)로 작성된 웹 서비스를 호출하는 C# 클라이언트를 작성하고 있습니다. 내 클라이언트에 웹 참조를 추가했고 웹 서비스에서 메소드를 호출 할 수있었습니다.개체 배열을 반환하는 Java 웹 서비스를 사용하도록 C# 클라이언트 작성

서비스가 개체 배열을 반환하도록 변경되었으며 클라이언트가 반환 된 SOAP 메시지를 올바르게 구문 분석하지 못합니다.

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

내 생성 된 C# 프록시 (SoapHttpClientProtocol.Invoke를 사용하여) 웹 서비스, I, 즉 하나의 요소 1의 길이가 MyResponse [] 배열을 기대하고 있습니다를 호출합니다. Invoke 호출 이후에 얻는 것은 서비스가 실제로 반환하는 것과 관계없이 id = 0 및 reason = null 인 요소입니다. 패킷 스니퍼를 사용하면 id 및 reason이 null이 아닌 값으로 설정된 합법적 인 SOAP 메시지로 보이는 서비스가 반환되고 있음을 알 수 있습니다.

someobject []를 반환하는 Java 웹 서비스를 호출하기 위해 C# 클라이언트를 얻으려면 어떤 트릭이 있습니까? 필요한 경우 살균 데모를 얻으려고 노력할 것입니다.

편집 : 이것은 "웹 참조 추가 ..."를 통한 웹 참조입니다. VS 2005, .NET 3.0.

+0

"웹 참조 추가"(.NET 2.0) 또는 "서비스 참조 추가"(.NET 3.0)를 사용하고 있습니까? –

답변

3

오랜 시간이 지났지 만 .Net과 Java 웹 서비스간에 기본 네임 스페이스가 처리되는 방식에 약간의 차이가있는 것을 기억하는 것 같습니다.

생성 된 C# 프록시 클래스와 선언 된 네임 스페이스 (특히 기본값 xmlns = "")를 자바 서비스가 기대하는 것과 비교하여 두 번 확인하십시오. 아마 당신이 재창조해야 할 아주 미묘한 차이가있을 것입니다.

이 경우에는 C# 속성에 더 많은 네임 스페이스 선언을 제공해야합니다.

0

질문에서 클라이언트가 한 지점에서 작동하고 서비스가 배열을 반환하도록 변경된 것 같습니다. 반환 된 SOAP 메시지가 클라이언트에서 deserialize되도록 프록시를 다시 생성해야합니다. 당신이 이것을 한 것은 확실하지 않았습니다.

+0

귀하의 이해가 정확합니다. MyResponse []를 반환 한 메서드를 추가 할 때까지 작동했습니다. 참조를 새로 고침하고 프록시가 다시 작성되었습니다. –

8

시안 덕분에 해결책이 있습니다.

서비스에 대한 WSDL은 라인

<import namespace="http://mynamespace.company.com"/> 

서버로 전송 클라이언트가 모든 데이터 요소에 다음과 같은 속성을 가지고 비누 포함

:

xmlns="http://mynamespace.company.com" 

를하지만의 XML 페이로드를 응답 이 아니고에이 네임 스페이스가 포함되어 있습니다 (서비스에서 클라이언트로). HTTP 응답 (내가 WireShark으로 얻음)을 수정하여 모든 반환 된 데이터 요소에 xmlns 특성을 강제로 적용하면 .NET 프록시 클래스가 MyResponse 값을 올바르게 선택했음을 알았습니다.

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")] 
public partial class MyResponse { 

및 주석 : 내가 제어하지 않는 서비스를 변경 짧은

는 해결 방법은 VS 프록시 클래스 (예를 들어 Reference.cs)를 생성 편집과 같은 라인을 찾는 것입니다 XmlType 특성 행 이렇게하면 CLR이 wsdl에서 지정한 것보다 기본 네임 스페이스에서 응답 요소를 찾도록 지시합니다.참조를 업데이트 할 때마다이 작업을 다시해야하지만 적어도 작동합니다.

+0

솔루션을 게시 해 주셔서 감사합니다. 추억의 홍수가 다시 나타났습니다! – Xian

관련 문제