Как ограничить свойства контракта данных веб-службы в зависимости от роли пользователя - PullRequest
1 голос
/ 02 марта 2012

У меня есть следующий веб-сервис:

[DataContract]
public class Project
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[OperationContract]
public Project GetProject(long Id);

Теперь я хочу добавить свойство SecretData, которое должно быть доступно только определенным пользователям. У меня есть несколько идей, но ни одна из них мне не подходит:

  1. Добавить свойство SecretData, допускающее нулевое значение, к Project. Если у пользователя нет прав на его просмотр, установите для него значение null. Это кажется самым простым подходом, но как потребитель скажет разницу между «без разрешения» null и допустимым значением null?
  2. Решение 1, но также добавьте логическое CanViewSecretData свойство. Это решает законную проблему null, но кажется громоздким.
  3. Укажите отдельную операцию SecretDataType GetSecretData(long projectId) для извлечения секретных данных и возврата ошибки, если у пользователя нет разрешения на ее вызов. Это сохраняет контракт данных чистым, но я вижу, что в конечном итоге мы получаем множество отдельных операций, которые необходимо вызывать для создания полного объекта.

Есть ли лучший подход?

1 Ответ

2 голосов
/ 05 марта 2012

Я понятия не имею, какой фреймворк вы используете, но с общей точки зрения веб-сервисов вот что я предлагаю. В XSD для Project добавьте необязательный элемент SecretData к Project. Когда пользователю не разрешено читать SecretData, не включайте элемент в ответ. В противном случае, включите элемент, и когда SecretData равен null, установите для атрибута xsi:nil значение true.

...