无法反序列化WCF代理类

时间:2013-02-04 20:06:29

标签: c# wcf xsd proxy-classes

这是情况。我有两个WCF服务,一个是BizTalk服务,另一个是用于查询数据存储库的简单'ol WCF服务。我有一个测试应用程序,它将服务引用添加到这两个服务中。我正在使用HL7v3模式将数据传入和传出这两种服务。

看来BizTalk WCF代理类是使用System.Xml.Serialization生成的,但是其他非BizTalk代理使用System.Runtime.Serialization来处理所有内容。

我可以使用BizTalk代理类反序列化,但不能使用另一个。我在尝试这样做时得到的错误是:

  

“targetNamespace参数'urn:hl7-org: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/")]

所以,我做了一些研究,发现你可以通过在Service / Method声明中添加一个属性来强制WCF服务使用XmlSerializer而不是DataContract:

[XmlSerializerFormat(Style=System.ServiceModel.OperationFormatStyle.Document)]

我在Reference.cs中注意到现在正在使用System.XmlSerialization,并且2个Reference.cs文件看起来非常相似。

现在,最终的问题是:

在切换XMLSerializer而不是DataContract之后,我实际上无法生成Proxy类的实例(这是一个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");
        }
    }
}

但是当你查看另一个(非BizTalk)服务的reference.cs时,

   public RCMR_IN000029UV01() {
    this.iTSVersionField = "XML_1.0";
}
类定义中缺少

。我错过了什么?

编辑:我忘了提及 Web服务基于使用xsd.exe从HL7v3 RCMR_IN000029UV01架构生成的类文件公开这些RCMR对象。换句话说,这不是我自己创造的课程。

1 个答案:

答案 0 :(得分:1)

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

您可能缺少RCMR_IN000029UV01类的[XmlRoot]属性。