首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有WCF SOAP的XmlSerializer添加根xmlns

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

Stack Overflow用户
提问于 2012-06-28 17:49:22
回答 2查看 2.3K关注 0票数 4

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

我已经创建了一个ServiceContract接口,这样我就可以使用WCF ChannelFactory连接到web服务,如下所示:

代码语言:javascript
复制
[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的重要部分

代码语言:javascript
复制
[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 Trace ):

代码语言:javascript
复制
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1">
        <dataSet>
            <dataEvents xsi:type="q1:DAInt" xmlns="" xmlns:q1="http://www.thirdparty.org/thirdapp">
                <id>47245361157</id>
                <time>
                    <tick_time>141728877218</tick_time>
                    <time>2012-06-28T10:07:57.218+01:00</time>
                    <time_type>OSACBM_TIME_MIMOSA</time_type>
                </time>
                <value>42</value>
            </dataEvents>
            <id xmlns="">0</id>
            <site xmlns="">
                <category>SITE_SPECIFIC</category>
            </site>
            <time xmlns="">
                <tick_time>141728877218</tick_time>
                <time>2012-06-28T10:07:57.218+01:00</time>
                <time_type>OSACBM_TIME_MIMOSA</time_type>
            </time>
        </dataSet>
    </serviceNotifyDataEventSet>
</s:Body>

因此,我能够调用web服务,它看起来好像我的数据正在正确序列化,但是在服务器端,dataSet显示为空。我还从一个客户端获得了一个跟踪,它可以与以下主体一起工作:

代码语言:javascript
复制
<soap:Body>
    <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1">
        <dataSet xmlns="http://www.thirdparty.org/thirdapp">
            <dataEvents xmlns:q1="http://www.thirdparty.org/thirdapp" xsi:type="q1:DAReal" xmlns="">
                <id>47245361408</id>
                <time>
                    <tick_time>141730618844</tick_time>
                    <time>2012-06-28T10:36:58.843+01:00</time>
                    <time_type>OSACBM_TIME_MIMOSA</time_type>
                </time>
                <value>12.34</value>
            </dataEvents>
            <id xmlns="">0</id>
            <site xmlns="">
                <category>SITE_SPECIFIC</category>
            </site>
            <time xmlns="">
                <tick_time>141730618843</tick_time>
                <time>2012-06-28T10:36:58.843+01:00</time>
                <time_type>OSACBM_TIME_MIMOSA</time_type>
            </time>
        </dataSet>
    </serviceNotifyDataEventSet>
</soap:Body>

我能看到的唯一区别是根名称空间是在工作包<dataSet xmlns="http://www.thirdparty.org/thirdapp">dataSet上设置的。在我的包中,根本没有指定名称空间。

我的问题是,我的分析听起来合理吗?如果合理,有什么方法可以让根xmln在我的dataSet上正确输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-20 20:59:59

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

代码语言:javascript
复制
public partial class DataEventSet 
{
    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces _xmlns;

    /// <summary>
    /// Constructor for DataEventSet that sets up default namespaces
    /// </summary>
    public DataEventSet()
    {
        _xmlns = new XmlSerializerNamespaces();
        _xmlns.Add("", "http://www.thirdparty.org/thirdapp");
        _xmlns.Add("o", "http://www.thirdparty.org/thirdapp");
    }
}

现在序列化如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<s:Body xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1">
    <dataSet xmlns="http://www.thirdparty.org/thirdapp" xmlns:o="http://www.thirdparty.org/thirdapp">
      <dataEvents xsi:type="o:DABool" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <id>47245361157</id>
        <value>true</value>
      </dataEvents>
      <id xmlns="">0</id>
      <site xmlns="">
        <category>SITE_SPECIFIC</category>
      </site>
      <time xmlns="">
        <tick_time>396106152171</tick_time>
        <time>2012-07-20T13:29:12.171Z</time>
        <time_type>OSACBM_TIME_MIMOSA</time_type>
      </time>
    </dataSet>
  </serviceNotifyDataEventSet>
</s:Body>
票数 1
EN

Stack Overflow用户

发布于 2012-07-13 22:49:21

你的分析听起来很合理。在查看您发布的代码时,我怀疑关于<dataSet>元素,DataEventSet类是否是您应该查看的类。使用System.Xml.Serialization.XmlRootAttribute应该允许您为元素定义/应用正确的名称空间。我的猜测是,您需要在不同的类上使用此属性才能使<dataSet>元素正确输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11242038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档