我正在开发 ASP.NET Web API ,允许 XML和JSON格式用于其资源。我的某个Web API服务的资源模型类型具有用户不会发送的属性。但我必须将其设置为我发回的响应。
例如,有一个POST请求,用户希望将新项目保存到数据库。我的服务使用相同的资源模型和另一个属性来响应,表明它已保存。
我已将此附加属性添加到我的资源模型中。当我在Fiddler中测试传递XML请求时,它抱怨HTTP400
说新属性丢失了。使用JSON输入,它工作正常,可能是由于默认的JSON设置JsonSerializerSettings.MissingMemberHandling
。
我们是否有与XML反序列化相同的属性?
示例输入XML:
<MyResource>
<Property1>ABC</Property1>
<Property2>DEF</Property2>
</MyResource>
我打算发送的示例输出XML:
<MyResource>
<Property1>ABC</Property1>
<Property2>DEF</Property2>
<Id>123</Id>
</MyResource>
错误看起来像:
The property Id was missing
我的资源模型如下:
public string Property1 { get; set; }
public string Property2 { get; set; }
public int Id { get; set; }
答案 0 :(得分:1)
Microsoft的“JSON and XML Serialization in ASP.NET Web API”页面有关于XML序列化的说法(在XML序列化标题下):
如果需要对序列化进行更多控制,可以使用 DataContract 属性修饰类。如果存在此属性,则按如下方式对类进行序列化:
- “选择加入”方法:默认情况下,属性和字段未序列化。要序列化属性或字段,请使用 DataMember 属性
进行装饰
DataMember属性具有以下property:
<强> IsRequired 强>
获取或设置一个值,该值指示序列化引擎在读取或反序列化时必须存在该成员。
因此,从文档中可以看出,使用[DataMember(IsRequired=false)]
装饰您的Id属性将允许XML Serializer允许它保持默认值。
但请注意,默认值为0,因此您需要明确检查该值是否为“无值”标记。如果要在逻辑上区分ID = 0的实体和 no ID的实体,请考虑将其类型更改为int?
,因此默认值为null
。