WCF: обязательные свойства на самом деле не требуются

Существует некоторое странное поведение, которого нельзя добиться с помощью параметра IsRequired.

Допустим, есть очень маленький DataContract:

  [DataContract]
  public class CommonEvent
  {
    [DataMember(IsRequired = true)]
    public string Name { get; set; }

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public string Description { get; set; }
  }

Когда я запускаю свой WebService и ссылаюсь на него, я получаю следующий xsd:

  <xs:complexType name = "CommonEvent">
    <xs:sequence>
      <xs:element minOccurs = "0" maxOccurs = "1" name = "Name" type = "xs:string" />
      <xs:element minOccurs = "0" maxOccurs = "1" name = "Description" type = "xs:string" />
    </xs:sequence>
  </xs:complexType>

Но этот XSD не требует имени ... Я читал совет добавить XmlElement(IsNullable = true) к имени, но это также не решает проблему, так как определение имени будет выглядеть следующим образом: <xs:element minOccurs = "1" maxOccurs = "1" name = "Name" nillable = "true" type = "xs:string" />, но оно все равно не требует никакого значения. Мое ожидание требуемого значения будет таким: <xs:element minOccurs = "1" maxOccurs = "1" name = "Name" type = "xs:string" /> (по умолчанию для nillable установлено значение «false»).

Что не так с моим определением? (или понимание?)

IsNullable = true означает, что он может быть нулевым. IsNullable = false означает, что он не может быть нулевым и является обязательным.
crunchy 29.10.2018 12:49

Вопрос касался необходимых файлов в DataCantact, которые определены следующим образом: <xs:element minOccurs = "0" maxOccurs = "1" name = "Name" type = "xs:string" />, несмотря на IsRequired = true. Что касается IsNullable = false, я где-то читал, что это обходной путь, чтобы сделать minOccurs = "1" (вместо minOccurs = "0" ) набором IsNullable = true (чтобы получить minOccurs = "1" ), но это не требует значения.

Vadim 29.10.2018 13:07

Флаг IsRequired в DataContract предназначен для проверки, поэтому вы должны иметь возможность получать запрос с опущенным полем, но он должен вызывать исключение при обработке, которое вы обрабатываете в своем коде.

crunchy 29.10.2018 14:00

Это для проверки на стороне сервера. Подтверждение на стороне клиента вам придется написать самостоятельно.

crunchy 29.10.2018 14:01

Да, и хотелось бы получить эту проверку. Но это не работает! В моем случае, когда я отправляю объект без имени (имя имеет значение null), тогда нет исключения проверки (на сервере). Мое предположение, что нет никаких исключений, потому что minOccurs для Name равен 0.

Vadim 29.10.2018 14:04

Работает как задокументировано - как указано в DataContractVersioning«Хотя для свойства IsRequired установлено значение true, входящие данные могут быть нулевыми или нулевыми, и тип должен быть подготовлен для обработки этой возможности. Не используйте IsRequired в качестве механизма безопасности для защиты от неверных входящих данных».

stuartd 29.10.2018 17:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
449
0

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