使用带有WCF SOAP的XmlSerializer添加根xmlns

我有一个类文件,由我们的客户从第三方提供的XML Schema文档生成。 我应该能够将这个生成的类用于客户的SOAP Web服务,但是我遇到了一些问题。

我已经创建了一个ServiceContract接口,因此我可以使用WCF ChannelFactory连接到Web服务,如下所示:

 [ServiceContract(Namespace = "http://theircompany.co.uk/theirapp/v1")] [XmlSerializerFormat] public interface IWebService { [OperationContract] EPSStatus serviceNotifyDataEventSet( [XmlElement(Namespace = "http://www.thirdparty.org/thirdapp")] DataEventSet dataSet ); } 

EPSStatusDataEventSet都在我生成的类文件中。 DataEventSet的重要部分:

 [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.thirdparty.org/thirdapp")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.thirdparty.org/thirdapp", IsNullable=false)] public partial class DataEventSet { //... } 

当我现在尝试调用IWebService.serviceNotifyDataEventSet我得到以下SOAP主体(在其服务器上启用了WCF跟踪):

     47245361157  141728877218 2012-06-28T10:07:57.218+01:00 OSACBM_TIME_MIMOSA  42  0  SITE_SPECIFIC   141728877218 2012-06-28T10:07:57.218+01:00 OSACBM_TIME_MIMOSA     

所以,我能够调用Web服务,看起来好像我的数据正确序列化,但是在服务器端, dataSet会出现空值。 我也从一个与以下机构合作的客户端得到了一个跟踪:

     47245361408  141730618844 2012-06-28T10:36:58.843+01:00 OSACBM_TIME_MIMOSA  12.34  0  SITE_SPECIFIC   141730618843 2012-06-28T10:36:58.843+01:00 OSACBM_TIME_MIMOSA     

我能看到的唯一区别是根命名空间是在工作包上的dataSet上设置的: 。 在我的数据包中,根本没有指定名称空间。

我的问题是,我的分析听起来是否合理?如果是这样,有什么方法可以让我的数据集上的根xml输出正确吗?

我现在已经设法使用相对简单的方法来实现这一点。 幸运的是, xsd从XML Schema生成的代码将所有类标记为部分没有构造函数。 我添加了自己的部分类来定义覆盖命名空间的默认构造函数,如下所示:

 public partial class DataEventSet { [XmlNamespaceDeclarations] public XmlSerializerNamespaces _xmlns; ///  /// Constructor for DataEventSet that sets up default namespaces ///  public DataEventSet() { _xmlns = new XmlSerializerNamespaces(); _xmlns.Add("", "http://www.thirdparty.org/thirdapp"); _xmlns.Add("o", "http://www.thirdparty.org/thirdapp"); } } 

现在序列如下:

      47245361157 true  0  SITE_SPECIFIC   OSACBM_TIME_MIMOSA     

你的anaylsis听起来很合理。 在查看您发布的代码时,我怀疑DataEventSet类是否是您应该关注元素的类。 使用System.Xml.Serialization.XmlRootAttribute应该允许您为元素定义/应用正确的命名空间。 我的猜测是你需要在另一个类上使用这个属性来正确输出元素。