【问题标题】:Is there an equivalent to JsonSerializerSettings.MissingMemberHandling for XML serialization during Web API request handling?在 Web API 请求处理期间是否有与 JsonSerializerSettings.MissingMemberHandling 等效的 XML 序列化?
【发布时间】:2016-04-06 11:49:31
【问题描述】:

我正在开发一个 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; }

【问题讨论】:

    标签: c# asp.net-web-api xml-deserialization json-deserialization


    【解决方案1】:

    Microsoft 的“JSON and XML Serialization in ASP.NET Web API”页面有关于 XML 序列化的说明(在 XML 序列化标题下):

    如果您需要对序列化进行更多控制,可以使用 DataContract 属性装饰类。当这个属性存在时,类被序列化如下:

    • “选择加入”方法:默认情况下不序列化属性和字段。要序列化属性或字段,请使用 DataMember 属性
    • 对其进行装饰

    DataMember 属性有以下property

    是必需的
    获取或设置一个值,该值指示序列化引擎在读取或反序列化时该成员必须存在。

    因此,从文档看来,用[DataMember(IsRequired=false)] 装饰您的 Id 属性将允许 XML 序列化程序允许它保持其默认值。

    但请注意,默认值为 0,因此您需要明确检查该值是否为“无值”标记。如果您想在逻辑上区分 ID=0 的实体和 no ID 的实体,请考虑将其类型更改为 int?,因此默认值为 null

    【讨论】:

    • 我用DataContract装饰了模型,用DataMember(IsRequired = false)装饰了属性。仍然得到同样的错误。试图深入了解我的媒体类型格式化程序设置,看看我是否需要在那里调整一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多