여기 상황이 있습니다. 두 가지 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 오브젝트를 노출한다을 언급하는 것을 잊었다. 다시 말해서, 내가 직접 만든 수업이 아닙니다.
웹 서비스가 제공하는 생성 된 클래스에 실제로 존재한다고 생각했지만, 실제로는 그렇습니다. '[System.Xml.Serialization.XmlRootAttribute (Namespace = "urn : hl7-org : v3", IsNullable = false)]' – Bensonius