Как настроить свойство только для получения для службы WCF с поддержкой Silverlight - PullRequest
2 голосов
/ 31 декабря 2008

Я не уверен, где возникает ошибка (из-за 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», чтобы разрешить использование только для получения или свойство с частным набором) для передачи его по проводам?

Ответы [ 2 ]

3 голосов
/ 02 января 2009

Спасибо. Частный набор кажется достаточным. Мне не нравится иметь метод set там, когда он не нужен, но я могу выдать ошибку, если к нему обращаются.

[DataMember]  
public PropertyB {  
    get {  
         return "Hi there";  
    }  
    private set {  
         throw new Exception("Empty setter for use by WCF Service.");
    }  
}      

Или что угодно.

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

В вашем примере PropertyB не помечен атрибутом DataMember, что означает, что он не будет отображаться в WSDL и игнорироваться сериализатором. Но если вы пометите PropertyB с помощью DataMember, то для правильной сериализации вы должны иметь установщик (частный, защищенный или общедоступный), иначе вы можете получить исключение. Есть два способа, как я могу подумать о том, чтобы свойства, доступные только для чтения, сериализовались по проводам:

[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 , сгенерированный прокси-класс будет иметь как общедоступный метод получения, так и установку для свойства, которое может не соответствовать вашему запросу. В этом случае вы можете использовать договор на обслуживание и договор на данные на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...