2010-04-28 6 views
13

Wird die Klasse System.Tuple vom Data Contract Serializer von WCF unterstützt (d. H., Kann ich Tuple Objekte an WCF-Aufrufe übergeben und/oder sie als Teil oder Gesamtergebnis erhalten)?Senden eines Tuple-Objekts über WCF?

Ich fand this page, aber nicht die klare, endgültige "Sie können Tuples mit WCF senden und empfangen" Antwort ich hatte gehofft.

Ich vermute, dass Sie können, solange alle Typen innerhalb die Tuple sich durch den Datenvertrag Serializer unterstützt werden - kann mir jemand bieten mit einer endgültigen Antwort? Vielen Dank.

+0

Tupel sollten in WCF funktionieren, solange es sich bei den Typen im Tupel um Basistypen handelt, nicht um benutzerdefinierte Typen. Wenn dies der Fall ist, wird eine zirkuläre Abhängigkeit vom Client verursacht, da der Client kein Tupel ist, sondern TupleT.Ich habe jetzt Probleme damit. Generic in Web-Services scheint eine schlechte Idee zu sein. – irperez

Antwort

14

Die Typen Tuple sind mit SerializableAttribute gekennzeichnet. Wenn die darin gespeicherten Typen serialisierbar sind, sollten sie daher auch von WCF serialisiert werden können.

Check out: Links Tuple'1, Tuple'2 usw. Dort heißt es:

[SerializableAttribute] 
public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple 

Beachten Sie, dass das Dokument, das Sie die folgende Zeile verknüpft enthält:

Das [Serializable]/ISerializable Programmiermodell wird in einer Teilvertrauensumgebung nicht unterstützt.

Es mag also nicht so einfach sein, wie es scheint.

(BTW, ist die Tuple static class auch einen Besuch wert.)

9

Ich war gerade in diesem Graben mich, und es scheint, dass ein Problem sein könnte, wenn Sie den WCF-Dienst durch Silverlight sind raubend: siehe Davy Brion's blog für Mehr.

Die Silverlight-Version von Tuple verfügt nicht über das Serializable-Attribut, das derzeit ein Problem darstellt.

5

Ich habe Tuples funktioniert gut mit .NET 4.0 und WCF (Erinnerung: Sie benötigen .NET 4.0 für Tuple-Unterstützung).

ist die Einheit Meßmethode (die das Verfahren über die WCF Schicht nennt):

/// <summary> 
/// Test Tuples 
/// </summary> 
[TestMethod()] 
public void WcfTestTupleUnit() 
{ 
    Tuple<double, double> x; 
    x=CallViaWCF.testTuple(); 
    Assert.AreEqual(x.Item1, 42); 
    Assert.AreEqual(x.Item2, 43); 
} 
#endregion 

Hier ist die Schnittstelle:

[OperationContract] 
Tuple<double, double> testTuple(); 

Hier ist die Umsetzung:

public Tuple<double, double> testTuple() 
{ 
    return new Tuple<double, double>(42, 43); 
} 

Ich habe es gerade getestet durch Debuggen mit einer "WCF Service Application" (siehe New .. Project), die th dient Der WCF-Dienst. Ich verwende diese Methode zum Debuggen, da ich den Debugger verwenden kann, um nahtlos vom WCF-Client in den WCF-Dienst und wieder zurück zu gehen, was manchmal recht nützlich ist.

Ich habe diese Methode auch gerade getestet, indem ich sie sowohl in einer Konsolen-App als auch in einer Service-App implementiert habe, also funktioniert sie definitiv für mich.

+0

Versuchte es auf einem funktionierenden WCF-Dienst, der .Net 4.71 für die aufrufende Anwendung verwendet und .Net 4.61 für den WCF und andere Klassenbibliotheken verwendet. Got this errormessage: Kann den Typ NameOfServiceReference.TupleofBooleanint nicht in System.Tuple konvertieren. Die selbe Fehlermeldung, wenn ich die Klasse ValueTuple anstelle von Tuple ausprobiert habe. – JRB