XSD simpleContent with WCF / Web API

时间:2016-03-01 10:45:36

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

在处理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 ....

1 个答案:

答案 0 :(得分:0)

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

适用于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;
}

请注意,只有在您的基类是部分基础时才可以这样做。

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