WCF verslikt zich in eigenschappen zonder “set”. Een oplossing?

Ik heb een klasse die ik doorgeef als resultaat van een servicemethode, en die klasse heeft een alleen-get-eigenschap:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

Ik krijg een uitzondering aan de servicekant:

System.Runtime.Serialization.InvalidDataContractException: Geen set
methode voor eigenschap ‘Message’ in type ‘MyNamespace.ErrorBase’.

Ik moet deze eigenschap hebben als enige getter, ik kan niet toestaan ​​dat gebruikers er een waarde aan toekennen. Enige oplossing die ik zou kunnen gebruiken? Of mis ik een extra kenmerk?


Antwoord 1, autoriteit 100%

Geef Bericht een openbare getter maar beschermde setter, zodat alleen subklassen (en de DataContractSerializer, omdat deze vals speelt 🙂 de waarde kunnen wijzigen.


Antwoord 2, autoriteit 12%

Zelfs als u de waarde niet hoeft bij te werken, wordt de setter door de WCFSerializer gebruikt om het object te deserialiseren (en de waarde opnieuw in te stellen).

Dit is wat je zoekt:
WCF-gegevenscontracten


Antwoord 3, autoriteit 10%

[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}

Antwoord 4, autoriteit 5%

Kun je niet gewoon een “do-niets” setter hebben??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

Of doet de DataContract-serializer dat ook niet??


Antwoord 5, autoriteit 5%

Als je alleen een getter hebt, waarom zou je dan de eigenschap moeten serialiseren. Het lijkt erop dat je het DataMember-kenmerk voor de alleen-lezen eigenschap zou kunnen verwijderen, en de serializer zou de eigenschap gewoon negeren.


Antwoord 6, autoriteit 2%

Voor eigenschappen met het kenmerk DataMember is altijd een set vereist. U moet een soortgelijk object opnieuw schrijven in de clienttoepassing, aangezien aan DataContract-leden altijd waarden kunnen worden toegewezen.


Antwoord 7, autoriteit 2%

Ik had dit probleem met ASP.NET MVC en ik wilde DataContractSerializer gebruiken om de namen van de items in de JSON-uitvoer te kunnen beheren. Uiteindelijk schakelde ik serializer over naar JSON.NET, dat eigenschappen ondersteunt zonder setters (wat DataContractSerializer niet doet) en eigenschapsnaambeheer (wat de ingebouwde JSON-serializer in ASP.NET MVC niet doet) via [JsonProperty(PropertyName = "myName")].


Antwoord 8, autoriteit 2%

Als het een haalbare optie is, definieer het dan als volgt in plaats van ErrorBaseals basisklasse:

   public interface IError
    {
        string Message
        {
            [OperationContract]
            get;
            // leave unattributed
            set;
        }
    }

Ook al bestaat er een setter, deze is niet toegankelijk voor de klant via het WCF-kanaal, dus het is alsof het privé is.

Other episodes