J'essaie de passer une classe avec une propriété Dictionary sur WCF et elle échoue pour une méthode mais fonctionne pour une autre. Lorsque la classe est retournée dans un List
, cela fonctionne. Mais lorsque la classe est renvoyée à l'intérieur d'un DataTable
, le client indique simplement que la connexion a été déconnectée et qu'aucune erreur n'apparaît.Impossible de sérialiser le membre ... de type System.Collections.Generic.Dictionary`2 car il implémente IDictionary
Voici les questions faisant de classe:
[DataContract]
public class DetailLog
{
[DataMember]
public string Name
{
get;
set;
}
[DataMember]
public string SubAction
{
get;
set;
}
[DataMember]
public Dictionary<string, string> Fields
{
get;
set;
}
[DataMember]
public string UserName
{
get;
set;
}
}
moi avons commencé la création d'une méthode qui fonctionne sans problème:
public List<DetailLog> GetDetailLog(List<int> IDs, List<int> actionTypeIds, List<int> userIds, DateTime beginDate, DateTime endDate)
Ensuite, nous avons besoin de créer des rapports très dynamiques si je DataTable que nous avons utilisé précédemment pour d'autres rapports dynamiques.
Mais je devais passer le long de la classe DetailLog donc je créé une colonne DataTable de ce type:
public DataTable GetCustomDetailReport(int CustomReportID, List<CustomReportFilter> reportFilters)
{
DataTable data = new DataTable();
...
data.Columns.Add("DetailLog", typeof(DetailLog));
...
}
Cette méthode sortirait bien sur le côté hôte WCF mais le côté client aurait erreur sur la connexion être perdu. J'ai essayé d'ajouter ServiceKnownType pour la OperationContract dans l'interface, mais il n'a pas le réparer:
[OperationContract]
[ServiceKnownType(typeof(DetailLog))]
DataTable GetCustomUserAuditReport(int CustomReportID, List<CustomReportFilter> reportFilters);
Je ne peux pas vraiment déboguer la sérialisation lorsque la méthode retourne le DataTable alors j'ai ajouté ce code à la fin du GetCustomDetailReport() à attraper l'erreur.
DataContractSerializer ser = new DataContractSerializer(typeof(DataTable), new List<Type> { typeof(DetailLog) });
ser.WriteObject(Stream.Null, data);
Quand je l'ai fait, j'ai vu une exception
Cannot serialize member ... of type System.Collections.Generic.Dictionary`2 because it implements IDictionary.
Merci pour cette explication complète! – sean