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