Как настроить свойство только для получения для службы WCF с поддержкой Silverlight
-
03-07-2019 - |
Вопрос
Я не уверен, откуда берется ошибка (из silverlight, из wcf, что-то еще ...), но у меня есть служба WCF, вызываемая из Silverlight.Метод возвращает класс со свойством, у которого нет установщика.Это выдает ошибку.Если я добавлю установщик к свойству, то он не выдаст ошибку.
Ошибка представляет собой обычное непроницаемое и бесполезное сообщение об ошибке Silverlight, но...
[Serializable]
[DataContract]
public SomeClass {
DataMember]
public string PropertyA { get; set; }
public string PropertyB { get { return "Hi There"; } }
}
Выдает ошибку...
Но измените это на:
[Serializable]
[DataContract]
public SomeClass {
[DataMember]
public string PropertyA { get; set; }
public string PropertyB { get { return "Hi There"; } set {} }
}
Ошибки нет.
Включает обычный класс ISomeService.svc и SomeService.svc, ссылки, обновленные в Silverlight, вызывающем клиент асинхронно, и т.д., и т.п.
Каков правильный способ настроить свойство (какой-либо атрибут, отличный от "DataMember", чтобы разрешить только получение или свойство с частным набором) для передачи его по проводу?
Решение
В вашем примере PropertyB не помечен атрибутом DataMember, что означает, что он не будет представлен в WSDL и проигнорирован сериализатором.Но если вы пометите PropertyB параметром DataMember, то у вас должен быть установщик (private, proptected или public), чтобы правильно сериализовать его, иначе вы можете получить исключение.Есть два способа, которыми я могу представить себе сериализацию свойств, доступных только для чтения, по проводам:
[DataContract]
public class SomeClass
{
public SomeClass()
{
_propertyB = "Hi there";
}
[DataMember(Name="PropertyB")]
private readonly string _propertyB;
public string PropertyB
{
get { return _propertyB; }
}
}
Или это:
[DataContract]
public class SomeClass
{
public SomeClass()
{
PorpertyB = "Hi there";
}
[DataMember]
public string PropertyB
{
get;
private set;
}
}
Пожалуйста, обратите внимание, что если вы используете svcutil.exe, сгенерированный прокси-класс будет иметь как общедоступный получатель, так и установщик для свойства, которое может быть не тем, что вы ищете.В этом случае вы можете использовать сборки контракта на обслуживание и контракта на передачу данных на стороне клиента.
Другие советы
Спасибо.Частный набор, по-видимому, достаточен.Мне не нравится использовать метод set, когда он не нужен, но я могу выдать ошибку, если к нему обращаются.
[DataMember]
public PropertyB {
get {
return "Hi there";
}
private set {
throw new Exception("Empty setter for use by WCF Service.");
}
}
Или что там еще.