Как настроить свойство только для получения для службы WCF с поддержкой Silverlight

StackOverflow https://stackoverflow.com/questions/403943

Вопрос

Я не уверен, откуда берется ошибка (из 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.");
    }  
}      

Или что там еще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top