1

Я работаю над ASP.NET Web API, который позволяет XML и JSON форматы за свои ресурсы. Тип модели ресурса для одной из моих служб веб-API имеет свойство, которое пользователи не будут отправлять. Но я должен установить это в ответ, что я отправлю обратно.Есть ли эквивалент JsonSerializerSettings.MissingMemberHandling для сериализации XML во время обработки запросов 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

«JSON and XML Serialization in ASP.NET Web API» страница Microsoft имеет это сказать о XML-сериализации (под XML сериализации заголовком):

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

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

Атрибут DataMember имеет следующие property:

требуется копаться
Возвращает или задает значение, которое инструктирует который должен присутствовать при чтении или десериализации.

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

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

+0

Я украсил модель 'DataContract' и свойство с помощью DataMember (IsRequired = false)'. По-прежнему получается такая же ошибка. Пытаясь вникнуть в настройки форматов медиа-типа, чтобы увидеть, нужно ли мне что-то там подстроить. –