这是情况。我有两个WCF服务,1是BizTalk服务,另一个是用于查询数据存储库的普通'WCF服务。我有一个测试应用程序,其服务引用已添加到这两个服务中。我使用HL7v3模式将数据传入和传出这两种服务。无法反序列化WCF代理类
它看起来使用System.Xml.Serialization
生成了BizTalk WCF代理类,但其他非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/")]
所以,我做了一些研究和发现,你可以强制WCF服务使用XmlSerializer而不是通过向服务/方法声明的属性DataContract:
[XmlSerializerFormat(Style=System.ServiceModel.OperationFormatStyle.Document)]
我注意到了在Reference.cs中的System.XmlSerialization正在被使用,并且2个Reference.cs文件开始看起来非常相似。
现在,最后的问题是这样:
切换XMLSerializer的而非DataContract后,我不能实际生成代理类的一个实例(其是HL7v3 RCMR_IN000029UV01),因为根节点(其最终成为对象类型)在生成代理类时不会遇到。所以当谈到反序列化(或只是试图创建一个实例)时,我不能这样做,例如:XmlSerializer pXmlSerializer = new XmlSerializer(RCMR_IN000029UV01);
,因为RCMR_IN000029UV01不存在任何地方。
服务本身很简单:
[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);
}
不过,我不是太与WCF服务还没有经历过,所以我不知道是否有什么我失踪在属性方面,等
看来唯一的真正区别是代理类缺少架构的根节点的实际构造,这里是什么样子的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");
}
}
}
但是当你看reference.cs为其他(非的BizTalk)的服务,
public RCMR_IN000029UV01() {
this.iTSVersionField = "XML_1.0";
}
从类定义缺失。我错过了什么?
编辑:我忘了提及 webservice基于使用xsd.exe从HL7v3 RCMR_IN000029UV01模式生成的类文件公开这些RCMR对象。换句话说,这不是我自己创建的课程。
我想到了这一点,但它确实存在于Web服务公开的类中: '[System.Xml.Serialization.XmlRootAttribute(Namespace =“urn:hl7-org:v3”, ISNULLABLE =假)]' – Bensonius