Существует некоторое странное поведение, которого нельзя добиться с помощью параметра 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»).
Что не так с моим определением? (или понимание?)
Вопрос касался необходимых файлов в DataCantact, которые определены следующим образом: <xs:element minOccurs = "0" maxOccurs = "1" name = "Name" type = "xs:string" />
, несмотря на IsRequired = true
. Что касается IsNullable = false
, я где-то читал, что это обходной путь, чтобы сделать minOccurs = "1"
(вместо minOccurs = "0"
) набором IsNullable = true
(чтобы получить minOccurs = "1"
), но это не требует значения.
Флаг IsRequired в DataContract предназначен для проверки, поэтому вы должны иметь возможность получать запрос с опущенным полем, но он должен вызывать исключение при обработке, которое вы обрабатываете в своем коде.
Это для проверки на стороне сервера. Подтверждение на стороне клиента вам придется написать самостоятельно.
Да, и хотелось бы получить эту проверку. Но это не работает! В моем случае, когда я отправляю объект без имени (имя имеет значение null), тогда нет исключения проверки (на сервере). Мое предположение, что нет никаких исключений, потому что minOccurs
для Name равен 0.
Работает как задокументировано - как указано в DataContractVersioning«Хотя для свойства IsRequired установлено значение true, входящие данные могут быть нулевыми или нулевыми, и тип должен быть подготовлен для обработки этой возможности. Не используйте IsRequired в качестве механизма безопасности для защиты от неверных входящих данных».
IsNullable = true
означает, что он может быть нулевым.IsNullable = false
означает, что он не может быть нулевым и является обязательным.