2010-11-19 10 views
0

Nous avons une application existante pour laquelle un de nos objets DTO a une propriété tapée IDictionary<string, object>. Je cherche maintenant à exposer cet objet à travers un service WCF. Cela fonctionne dans certains cas, mais pas dans le cas général. Pour démontrer le problème, tenez compte des deux méthodes suivantes:Sérialisation IDictionary <chaîne, objet> dans WCF

[OperationContract] 
public IDictionary<string, object> Test1() 
{ 
    return new Dictionary<string, object> 
    { 
     { "testkey1", "newstringvalue"}, 
    }; 
} 

[OperationContract] 
public IDictionary<string, object> Test2() 
{ 
    return new Dictionary<string, object> 
    { 
     { "testkey1", "newstringvalue"}, 
     { "testkey2", new object [] { "one" , "two", "three", } } 
    }; 
} 

Méthode Test1() fonctionne comme prévu, mais quand je l'appelle Test2(), je reçois une erreur d'exécution étrange sur le client:

The request channel timed out while waiting for a reply after 00:01:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

Inner exception: The remote server returned an error: (504) Gateway Timeout.

Ceci en dépit du fait que l'exception a été lancée instantanément, à savoir. Je n'ai pas vraiment attendu une minute pour cette réponse. Aucune erreur n'est affichée sur le serveur.

Je suppose que cela provient du fait que le sérialiseur ne peut pas sérialiser l'objet [], mais ce n'est pas ce qui est indiqué par l'erreur.

Mes questions sont les suivantes:

  1. ce qui se passe ici?
  2. Comment est-ce que je travaille autour de ceci afin que je puisse sérialiser mes objets correctement?

Merci.

+0

Est-ce que ce doit être un objet? si c'est une collection de chaînes, ne pouvez-vous pas utiliser une liste, un tableau, etc.? – timothyclifford

Répondre

0

Comme À la fin, nous avons résolu le problème en enveloppant notre objet dans un objet personnalisé, qui convertit le Dictionary<string, object> en un Dictionary<string, string>, qui possède un cas de sérialisation spécial défini pour les tableaux de chaînes. Nous avons ensuite changé l'application pour être conscient de cela. Pas particulièrement élégant, mais assez simple, et semble fonctionner.

0

Je pense que vous devez ajouter object [] aux types connus avec KnownTypeAttribute pour que le 2ème cas fonctionne, puisque c'est ce que vous mettez dans le dictionnaire.

Dans tous les cas, pour voir la vraie erreur sur le serveur, vous devez activer WCF Tracing (ou exécuter d'autre le débogueur en mode où il arrête à chaque exception, même si elle est pris)

+0

Ajout de l'objet [] aux types connus n'a pas aidé (et n'a pas ajouté d'objet, bien que je ne pensais pas que ce serait le cas). En fait, WCF n'a aucun problème à sérialiser l'objet [] - le problème se produit lors de la conversion de cet objet en objet avant d'être sérialisé. C'est quand nous recevons l'erreur Gateway Timeout. –