La WCF s'étouffe sur les propriétés sans "set ". Aucune solution de contournement?
j'ai une classe que je passe en raison d'une méthode de service, et cette classe a une propriété get-only:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
je suis l'exception d'un côté service:
Système.Runtime.Sérialisation.InvalidDataContractException: Aucun méthode pour la propriété 'Message' dans le type ' MyNamespace.ErrorBase".
je dois avoir cette propriété car seulement getter, Je ne peux pas permettre aux utilisateurs d'assigner une valeur. Aucune solution de contournement que je pourrais utiliser? Ou est-ce que je manque un attribut supplémentaire?
8 réponses
donner Message un getter public mais setter protégé, de sorte que seules les sous-classes (et le DataContractSerializer, parce qu'il trompe :) peut modifier la valeur.
même si vous n'avez pas besoin de mettre à jour la valeur, le setter est utilisé par le WCFSerializer pour désérialiser l'objet (et re-définir la valeur).
C'est ainsi que vous êtes après: WCF DataContracts
[DataMember(Name = "PropertyName")]
public string PropertyName
{
get
{
return "";
}
private set
{ }
}
Si vous avez seulement un getter, pourquoi avez-vous besoin de sérialiser la propriété. Il semble que vous puissiez supprimer L'attribut DataMember pour la propriété en lecture seule, et le serializer ignorerait simplement la propriété.
ne pourriez-vous pas avoir un setter" ne rien faire"??
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message
{
get { return ""; }
set { }
}
}
ou est-ce que le DataContract serializer barf aussi??
propriétés avec l'attribut DataMember nécessite toujours set. Vous devez réécrire l'objet simmilar sur l'application client car les membres DataContract peuvent toujours se voir attribuer des valeurs.
j'ai eu ce problème avec ASP.NET MVC et moi voulant utiliser DataContractSerializer afin d'être en mesure de contrôler les noms sur les articles dans la sortie JSON. Finalement je suis passé serializer à JSON.NET, qui supporte les propriétés sans setters (ce que DataContractSerializer ne fait pas) et le contrôle de nom de propriété (ce que le JSON serializer intégré dans ASP.NET MVC doesn't) via [JsonProperty(PropertyName = "myName")]
.
si c'est une option viable, alors au lieu d'avoir ErrorBase
comme classe de base, définissez-la comme suit:
public interface IError
{
string Message
{
[OperationContract]
get;
// leave unattributed
set;
}
}
maintenant, même si un setter existe, il est inaccessible au client via WCF channel, donc c'est comme s'il était privé.