2013-02-04 137 views
2

这是情况。我有两个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对象。换句话说,这不是我自己创建的课程。

回答

1

问题不在于未将默认构造函数添加到非biztalk服务。如果不在代码中,C#编译器将生成一个默认构造函数。

可能是因为缺少RCMR_IN000029UV01类中的[XmlRoot]属性。

+0

我想到了这一点,但它确实存在于Web服务公开的类中: '[System.Xml.Serialization.XmlRootAttribute(Namespace =“urn:hl7-org:v3”, ISNULLABLE =假)]' – Bensonius