2010-11-19 5 views
0

Wir haben eine vorhandene Anwendung, für die eines unserer DTO-Objekte eine Eigenschaft hat, die als IDictionary<string, object> typisiert wird.Serialisierung von IDictionary <string, object> in WCF

Ich versuche nun, dieses Objekt über einen WCF-Dienst verfügbar zu machen. Dies funktioniert in einigen Fällen, aber nicht im allgemeinen Fall. Um das Problem zu demonstrieren, sollten Sie die folgenden zwei Methoden:

[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", } } 
    }; 
} 

Methode Test1() funktioniert wie erwartet, aber wenn ich Test2() aufrufe, erhalte ich einen seltsamen Laufzeitfehler auf dem 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.

Dies ist trotz der Tatsache, dass die Ausnahme sofort ausgelöst wurde, dh. Ich musste nicht wirklich eine Minute auf diese Antwort warten. Auf dem Server wird kein Fehler angezeigt.

Ich vermute, dass dies von der Tatsache herrührt, dass der Serializer Objekt [] nicht serialisieren kann, aber das ist nicht, was durch den Fehler angezeigt wird.

Also meine Fragen sind:

  1. Was ist hier los?
  2. Wie kann ich das umgehen, damit ich meine Objekte korrekt serialisieren kann?

Danke.

+0

Muss es ein Objekt sein? Wenn es sich um eine Sammlung von Strings handelt, können Sie keine Liste, Array usw. verwenden? – timothyclifford

Antwort

0

Wie Weder ich selbst noch irgendeiner meiner Kollegen konnte sich einen Weg vorstellen, wie diese Serialisierung direkt funktioniert. Am Ende haben wir das Problem gelöst, indem wir unser Objekt in ein benutzerdefiniertes Objekt gepackt haben, das die Dictionary<string, object> in eine Dictionary<string, string> konvertiert, die einen speziellen Serialisierungsfall hat für String-Arrays definiert. Wir haben dann die Anwendung geändert, um sich dessen bewusst zu sein. Nicht besonders elegant, aber einfach genug und scheint zu funktionieren.

0

Ich denke, dass Sie den bekannten Typen mit dem KnownTypeAttribute Objekt [] hinzufügen müssen, um den 2. Fall zu arbeiten, da das ist, was Sie in das Wörterbuch einfügen.

Auf jedem Fall die wirklichen Fehler auf dem Server zu sehen, müssen Sie drehen WCF Tracing auf (den Debugger im Modus oder sonst laufen, wo es auf jeder Ausnahme stoppt, auch wenn er gefangen wird)

+0

Das Hinzufügen von Objekt [] zu bekannten Typen hat nicht geholfen (und auch kein Objekt hinzugefügt, obwohl ich nicht dachte, dass es das tun würde). WCF hat tatsächlich kein Problem beim Serialisieren von Objekt [] - das Problem tritt auf, wenn dieses Objekt vor der Serialisierung in ein Objekt umgewandelt wird. Dies ist, wenn wir den Gateway Timeout Fehler bekommen. –

Verwandte Themen