2013-02-04 2 views
2

여기 상황이 있습니다. 두 가지 WCF 서비스가 있습니다. 하나는 BizTalk 서비스이고 다른 하나는 데이터 저장소를 쿼리하는 데 사용되는 일반 WCF 서비스입니다. 서비스 참조가이 두 서비스에 모두 추가 된 테스트 응용 프로그램이 있습니다. 나는 HL7v3 스키마를 사용하여이 두 서비스간에 데이터를주고받습니다.WCF 프록시 클래스를 deserialize 할 수 없습니다

BizTalk WCF 프록시 클래스는 System.Xml.Serialization을 사용하여 생성되지만 다른 BizTalk 프록시는 System.Runtime.Serialization을 사용하는 모든 것으로 나타납니다.

BizTalk 프록시 클래스를 사용하여 문제를 해결할 수 있지만 다른 것은 사용하지 마십시오. 그렇게하는 동안 내가 오류는 다음과 같습니다

"는의 targetNamespace 매개 변수 '항아리 : HL7-조직 : V3는'같은 값이어야의 targetNamespace ' http://schemas.datacontract.org/2004/07/'스키마."

당신이 Reference.cs 파일을보고,이 오류가 만드는 의미 때문에 : 그래서

[System.Runtime.Serialization.DataContractAttribute(Name="RCMR_IN000029UV01MCCI_MT000100UV01Message", Namespace="http://schemas.datacontract.org/2004/07/")]

, 나는 몇 가지 연구를하고 당신이 XmlSerializer를 사용하도록 WCF 서비스를 강제로 발견 오히려 서비스/메소드 선언에 속성을 추가하여 DataContract보다 : [XmlSerializerFormat(Style=System.ServiceModel.OperationFormatStyle.Document)]

내가 눈치 n에서 System.XmlSerialization이 사용되고 Reference.cs 파일이 매우 유사하게 보이기 시작합니다.

지금, 마지막 문제는 이렇게이다 :

DataContract보다는 XmlSerializer를 전환 한 후, 나는 실제로 (AN HL7v3 RCMR_IN000029UV01입니다) 프록시 클래스의 인스턴스를 생성 할 수 없습니다 루트 노드 (이 궁극적 때문에 객체 유형이 됨)은 프록시 클래스가 생성 될 때 발생하지 않습니다. 그래서 deserializing (또는 단지 인스턴스를 만들려고 할 때) 나는 그것을 할 수 없다 : XmlSerializer pXmlSerializer = new XmlSerializer(RCMR_IN000029UV01); 때문에 RCMR_IN000029UV01 어디서나 존재하지 않습니다.

서비스 자체는 매우 간단하다 : 나는 너무 WCF 서비스를 아직 경험하고 있지 않다, 그러나

[ServiceContract (Namespace="urn:hl7-org:v3")] 
[XmlSerializerFormat(Style = System.ServiceModel.OperationFormatStyle.Document)] 
public interface IRequestCDAService 
{ 

    [OperationContract] 
    string GetData(RCMR_IN000029UV01 query); 

    [OperationContract] 
    string GetDataByXML(XmlDocument queryXml); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 
} 

, 그래서 속성의 관점에서 누락 뭔가가 있는지 잘 모르겠어요, 등

그것은 유일한 진짜 차이를 나타납니다 여기에, 프록시 클래스는 스키마의 루트 노드에 대한 실제 생성자가 누락이다는 BizTalk 서비스의 프록시 클래스처럼 보이는 무엇이다 :

public partial class RCMR_IN000002UV01 : RCMR_IN000002UV01MCCI_MT000100UV01Message { 

    private string iTSVersionField; 

    public RCMR_IN000002UV01() { 
     this.iTSVersionField = "XML_1.0"; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string ITSVersion { 
     get { 
      return this.iTSVersionField; 
     } 
     set { 
      this.iTSVersionField = value; 
      this.RaisePropertyChanged("ITSVersion"); 
     } 
    } 
} 
,

그러나 당신이

public RCMR_IN000029UV01() { 
    this.iTSVersionField = "XML_1.0"; 
} 

이 클래스 정의에서 누락, 다른 (비 BizTalk) 서비스에 대한 reference.cs 볼 때. 내가 뭘 놓치고 있니?

편집 :이 웹 서비스가 xsd.exe를 사용하여 HL7v3 RCMR_IN000029UV01 스키마에서 생성 된 클래스 파일을 기반으로 이러한 RCMR 오브젝트를 노출한다을 언급하는 것을 잊었다. 다시 말해서, 내가 직접 만든 수업이 아닙니다.

답변

1

기본 생성자가 비 -biztalk 서비스에 추가되지 않은 것은 아닙니다. C# 컴파일러는 코드에없는 경우 기본 생성자를 생성합니다.

RCMR_IN000029UV01 클래스에 [XmlRoot] 특성이 누락되었을 수 있습니다.

+0

웹 서비스가 제공하는 생성 된 클래스에 실제로 존재한다고 생각했지만, 실제로는 그렇습니다. '[System.Xml.Serialization.XmlRootAttribute (Namespace = "urn : hl7-org : v3", IsNullable = false)]' – Bensonius

관련 문제