2

这是情况。我有两个 WCF 服务,一个是 BizTalk 服务,另一个是用于查询数据存储库的普通 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/")]

所以,我做了一些研究,发现你可以通过向服务/方法声明添加一个属性来强制 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");
        }
    }
}

但是,当您查看其他(非 BizTalk)服务的 reference.cs 时,

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

类定义中缺少。我错过了什么?

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

4

1 回答 1

1

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

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

于 2013-02-04T22:19:27.720 回答