Есть ли эквивалент JsonSerializerSettings.MissingMemberHandling для сериализации XML во время обработки запросов Web API?

Я работаю над 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; }

1 ответ

На странице Microsoft " Сериализация JSON и XML в ASP.NET Web API" можно сказать о сериализации XML (под заголовком "Сериализация XML"):

Если вам нужно больше контроля над сериализацией, вы можете украсить класс атрибутом DataContract. Когда этот атрибут присутствует, класс сериализуется следующим образом:

  • Подход "согласие": по умолчанию свойства и поля не сериализуются. Чтобы сериализовать свойство или поле, украсьте его атрибутом DataMember.

Атрибут DataMember имеет следующее свойство:

Необходимо
Получает или задает значение, которое указывает механизму сериализации, что элемент должен присутствовать при чтении или десериализации.

Итак, из документации может показаться, что украшение вашего свойства Id [DataMember(IsRequired=false)] позволит сериализатору XML разрешить ему оставаться в его значении по умолчанию.

Обратите внимание, что значение по умолчанию равно 0, поэтому вам нужно явно проверить это значение как маркер "без значения". Если вы хотите логически провести различие между объектом с идентификатором =0 и объектом без идентификатора, рассмотрите возможность изменения его типа на int?поэтому значение по умолчанию будет null,

Другие вопросы по тегам