J'ai créé un service WCF avec une méthode simple avec une propriété de type 'object' car cette propriété est destinée à être utilisée avec différents types d'objets, mais quand je lance la propriété à un autre type lève une exception invalidCastException. Le service ressemble à ceci:cast la propriété de type 'object' à knownType dans le client wcf
[ServiceContract]
[ServiceKnownType(typeof(List<ItemDataContract>))]
public interface IService
{
[OperationContract]
ItemContainer GetList();
}
[DataContract]
[KnownType(typeof(List<ItemDataContract>))]
public class ItemContainer
{
[DataMember]
public object Data { get; set; }
}
[DataContract]
public class ItemDataContract
{
[DataMember]
public string Id { get; set; }
}
et la mise en œuvre de la méthode:
public ItemContainer GetList()
{
return new ItemContainer
{
Data = new List<ItemDataContract> {new ItemDataContract{ Id = "1"}, new ItemDataContract{Id = "2"}
};
}
Du côté du client que j'ai l'appel à la méthode:
Service1 _proxy = new Service1();
var result = _proxy.GetList();
return (List<ItemDataContract>)result.Data;
le problème est que je reçois une exception de transtypage invalide du côté du client parce que le résultat. En interne, il est de type 'objet' au lieu d'être une liste, même s'il utilise le type serviceNom et le type connu.
Comment rendre cette distribution possible?
Est-ce une option pour rendre ItemContainer générique et il suffit de spécifier le type par opération? – Mark
oui Marquer, mais alors dans l'implémentation vous auriez un différent ItemContainer par type d'objet que vous voulez utiliser, résultant en un type différent pour chacun de ceci dans la référence de service du côté du client. –
Eh bien ce serait ma préférence personnelle de toute façon parce que sinon le client aurait besoin de connaître le détail de l'implémentation exacte du service afin de faire la distribution correcte. En ce qui concerne le problème en question, vous pouvez essayer (aucune idée si cela fonctionnera) de placer les données et les contrats de service dans un assembly référencé par le client et le service. Lorsque vous importez la référence de service, celle-ci fait référence à celles de l'assembly partagé. Peut-être que la distribution fonctionnera alors. Sinon, il n'y a probablement pas assez d'informations de type pour que l'exécution sache qu'elles sont de la même classe. – Mark