【问题标题】:XSD simpleContent with WCF/Web APIXSD simpleContent 与 WCF/Web API
【发布时间】:2016-03-01 10:45:35
【问题描述】:

在 XSD 中处理 simpleContent 标记时,我的 WebService 生成正确的 XML/JSON 时遇到问题。

首先,我只有一个 XSD 文件(没有 WSDL),内容如下(简化):

<xs:complexType name="VerticalDataValue">    
  <xs:simpleContent>
    <xs:extension base="NCADevicePublication:Double">
      <xs:attribute name="unit" type="NCADevicePublication:VerticalUnitEnum" />
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

<xs:simpleType name="Double">
  <xs:restriction base="xs:double" />
</xs:simpleType>

<xs:simpleType name="VerticalUnitEnum">
  <xs:restriction base="xs:string">
    <xs:enumeration value="ft"></xs:enumeration>
    <xs:enumeration value="m"></xs:enumeration>
  </xs:restriction>
</xs:simpleType>

然后我使用 Xsd.exe 生成我的类。

我对这种结构的期望,在 XML 输出中:

<altitudeCoordinate unit="ft">2.1</altitudeCoordinate>

我得到了什么:

<altitudeCoordinate>
  <Value>2.1</Value>
    <unit>ft</unit>
    <unitSpecified>true</unitSpecified>
</altitudeCoordinate>

我希望 JSON 也是如此:

"altitudeCoordinate": {
        "@unit": "ft",
        "text": "2.1"
 }

但我明白了:

"altitudeCoordinate":{
        "unit": "ft",
        "unitSpecified": "true,
        "Value": 2.1

我在MSDN 看到 xsd.Exe 无法识别 simpleContent 限制。

有没有办法获得这种“标准”输出或 .Net 无法做到?

谢谢

更新

我能够使它适用于我的 WCF 服务。解决方案非常简单......只需将 [XmlSerializerFormat] 放在界面的顶部,然后瞧。 原因是默认的序列化器(DataContractSerializer)无法正确处理xml属性。 另外,请注意 WCFStorm 也使用 DataContractSerializer:我发现即使使用 XmlSerializer,我在 WCFStorm 中也有错误的 XML。然后我检查了 SoapUI,它正在工作! (仍然损失了几个小时)。

那么现在,让我们在我的 Web API 项目中使用 JSON....

【问题讨论】:

    标签: json xml wcf xsd asp.net-web-api2


    【解决方案1】:

    最后我想出了一个解决方案。只是提醒一下:我的目标不是触摸生成的类。

    对于 SOAP/XML 正如我在更新中所说,解决方案非常简单,我只是在 WCF 界面上添加了以下属性:

    [XmlSerializerFormat]
    

    对于 REST/JSON 解决方案是为转换不好的“烦人”类定义 MetadataType 类。

    例如,这是在自动生成的文件中定义 VerticalDataValue 类的方式(我剥离了属性和命名空间):

    public partial class VerticalDataValue {
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public VerticalUnitEnum unit;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool unitSpecified;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public double Value;
    }
    

    我创建了另一个文件,其中包含所有 MetadataType 类,定义如下:

    [MetadataType(typeof(VerticalDataValueMetaClass))]
    public partial class VerticalDataValue { }
    public class VerticalDataValueMetaClass
    {
        [JsonProperty("@unit")]
        public VerticalUnitEnum unit;
    
        [JsonIgnore]
        public bool unitSpecified
    
        [JsonProperty("text")]
        public double value;
    }
    

    请注意,这只有在您的基类是部分的情况下才有可能。

    当然,这是高维护的代码,但至少这不会与自动生成的类混淆。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2011-07-14
      • 2016-12-09
      • 2012-03-10
      • 2012-05-30
      • 2013-01-21
      • 2017-07-04
      相关资源
      最近更新 更多