【问题标题】:Specifying inheritance in WCF XmlSchema在 WCF XmlSchema 中指定继承
【发布时间】:2011-03-30 12:43:09
【问题描述】:

我遇到了一种情况,我必须在数据类型上实现 IXmlSerializable,我将通过 WCF 服务发送它。但是当我尝试在xsd中标记基类时,服务引用无法再刷新,而我在xsd中写的类型为“找不到”。 这是xsd:

<xs:schema 
xmlns:tnsg="http://schemas.datacontract.org/2004/07/MyNS" 
elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/MyNS" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:base="http://schemas.datacontract.org/2004/07/BaseNS">
  <xs:complexType name="MyType">
    <xs:extension base="base:BaseType">
        <xs:sequence>
            <xs:element name="BProperties">
              <xs:complexType>
                <xs:sequence>
                  <xs:element minOccurs="0" name="BInfo" nillable="true" type="xs:string" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="AProperties">
                <xs:complexType >
                    <xs:sequence>
                      <xs:element minOccurs="0" name="AStuff" nillable="true" type="xs:string" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:extension>
  </xs:complexType>
  <xs:element name="MyType" nillable="true" type="MyType" />
</xs:schema>"

这里是 C#:

public static XmlQualifiedName GetMySchema(XmlSchemaSet xs)
{
   XmlSchema s =  XmlSchema.Read(new StringReader(xsd), (sender, eargs) => {  });
   xs.Add(s);
   return new XmlQualifiedName("MyType", "http://schemas.datacontract.org/2004/07/MyNS");
}

我假设我需要以某种方式导入 BaseType?

编辑: 我试过了

  var baseschemes = xs.Schemas("http://schemas.datacontract.org/2004/07/MyBase");
  foreach (XmlSchema item in baseschemes)
  {
      s.Includes.Add(item);
  }

它添加了一个模式(如预期的那样),但没有任何变化!

【问题讨论】:

    标签: .net wcf serialization xsd ixmlserializable


    【解决方案1】:

    问题是您当前的 WSDL 没有告诉客户端在哪里可以找到 targetNamespace 为“http://schemas.datacontract.org/2004/07/BaseNS”的模式。您应该在 WSDL 中包含另一个元素,其中包含此命名空间的完整架构,或者提供一个引用静态 XSD 的元素。

    【讨论】:

    • 如何提供静态XSD?我的 BaseType 是一个简单的 DataContract 类,我没有为它编写任何 XSD。我可以导出它吗?我可以从 XmlSchemaSet 加载它吗?
    • 请参阅原始帖子了解我的新(不成功)想法
    • WCF 不可能自己导出它;由于您使用的是 IXmlSerializable,它根本无法知道您是否关心该基本类型。
    • 我认为您应该能够使用 XsdDataContractExporter 生成所需的架构,不过:msdn.microsoft.com/en-us/library/…
    • 通过在 XmlSchemaSet 上调用 xs.Schemas(...) 我能够为我的 BaseType 找到已经生成的架构,但我无法将其添加到当前架构中(不断出现异常) .如何将其添加到当前? s.Includes.Add(schema) + ?似乎没有任何组合有效!
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多