Как указать, требуется ли поле в сгенерированном прокси - PullRequest
1 голос
/ 18 января 2009

Служба WCF, предоставляющая несколько элементов в DataContract как DataMember

[DataMember(IsRequired = true, EmitDefaultValue = false)]
public string Source;

[DataMember(IsRequired = true, EmitDefaultValue = false)]
public string Target;

В сгенерированном прокси-сервере (через ссылку добавления службы в VS 2008) на клиенте клиент может передать пустую или пустую строку в Source или Target. Как я могу принудительно установить источник и цель на стороне клиента. т. е. клиент должен получить исключение, если для Source или Target задано значение NULL, прежде чем вызывать сервисный вызов.

Ответы [ 4 ]

2 голосов
/ 18 января 2009

Вы не можете применить что-либо на стороне клиента. Подумайте об этом, клиент может быть специально разработан вами, может быть, даже не в .Net, как Java и т. Д. IsRequired = true означает, что тип должен иметь этот член, сериализованный по сети, значение может быть нулевым.

Единственный способ - выбросить исключение с вашего сервера, если значение равно нулю, и использовать правильный контракт ошибки.

1 голос
/ 18 января 2009

Атрибут IsRequired относится к проверке, которая происходит с данными, которые поступают по проводам. Если вы хотите, чтобы проверка выполнялась на стороне клиента, для этого вам необходимо добавить код на стороне клиента.

1 голос
/ 18 января 2009

Ну, и ноль (xsi: nil) и пустая строка являются значениями - они просто не являются желаемыми значениями.

Во время десериализации (на клиенте или сервере):

Вы могли бы попытаться поместить некоторый код в установщик, чтобы вызвать исключение для недопустимых значений?

В качестве альтернативы (для более сложных случаев) я считаю, что контракты данных поддерживают обратные вызовы десериализации, которые должны позволить вам проверить ...

Например, вы можете добавить (в частичном классе, если необходимо, на клиенте):

[OnDeserialized]
internal void OnDeserialized(StreamingContext context)
{
    if (string.IsNullOrEmpty(Bar))
    {
        throw new InvalidOperationException("No Bar!");
    }
}

Для проверок перед отправкой (на клиенте) вам потребуется добавить дополнительный метод проверки или, возможно (опять же, в частичном классе):

[OnSerializing]
internal void OnSerializing(StreamingContext context)
{
    if (string.IsNullOrEmpty(Bar))
    {
        throw new InvalidOperationException("No Bar!");
    }
}

Однако сервер должен также подтвердить это - вы не можете предположить, что это был ваш код клиента, который отправил сообщение.

0 голосов
/ 18 января 2009

Вы также можете взглянуть на блок приложения валидации и как он может интегрироваться в WCF:

http://msdn.microsoft.com/en-us/library/cc309334.aspx

...