2010-04-28 14 views
13

La classe System.Tuple è supportata dal serial contracter dati WCF (ad esempio, posso passare gli oggetti Tuple alle chiamate WCF e/o riceverli come parte o tutti i risultati)?Invio di un oggetto Tuple su WCF?

Ho trovato this page, ma non il chiaro, definitivo "è possibile inviare e ricevere tuple con WCF" risposta che speravo.

Sto indovinando che è possibile, a patto che tutti i tipi di all'interno il Tuple in sé sono supportati dal contratto dati Serializzatore - qualcuno mi può fornire una risposta più definitiva? Grazie.

+0

Le tuple dovrebbero funzionare correttamente in WCF purché i tipi all'interno della tupla siano di tipo base, non personalizzati. In tal caso, causerà una dipendenza circolare sul client poiché il client non sarà una tupla , sarà TupleT.Sto avendo problemi con questo ora. I servizi web generici sembrano essere una cattiva idea. – irperez

risposta

14

I tipi Tuple sono contrassegnati con SerializableAttribute, pertanto, se i tipi che si archiviano all'interno sono serializzabili, dovrebbero poter essere serializzati anche da WCF.

Partenza: legami di Tuple'1, Tuple'2, ecc Si dice:

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

Nota che il documento si è collegato contiene la seguente riga:

Il [Serializable]/modello di programmazione ISerializable non è supportato in un ambiente di fiducia parziale.

Quindi, potrebbe non essere così facile come sembrerebbe.

(a proposito, il Tuple static class è anche la pena di verificare.)

9

stavo solo scavare in questo me stesso, e sembra che un problema potrebbe essere se si sta consumando il servizio WCF tramite Silverlight: vedi Davy Brion's blog per Di Più.

La versione Silverlight di Tuple non ha l'attributo Serializable, che al momento presenta un problema.

5

Ho tuple che funzionano bene con .NET 4.0 e WCF (promemoria: è necessario .NET 4.0 per supporto Tuple).

Ecco il metodo di test di unità (che chiama il metodo attraverso lo strato WCF):

/// <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 

Qui è l'interfaccia:

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

Ecco l'attuazione:

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

L'ho appena testato eseguendo il debug usando una "Applicazione servizio WCF" (vedi New..Project), che serve e Servizio WCF. Io uso questo metodo per il debug, dato che posso usare il debugger per passare senza problemi dal client WCF al servizio WCF, e viceversa, che è abbastanza utile a volte.

Ho anche appena testato questo metodo distribuendolo sia su un'app per console che su un'app di servizio, quindi è sicuramente funzionante per me.

+0

Provato su un servizio WCF funzionante con .Net 4.71 per l'applicazione chiamante e utilizzando .Net 4.61 per WCF e altri classibeb di classe. Ottenuto questo errore: impossibile convertire il tipo NameOfServiceReference.TupleofBooleanint in System.Tuple . Lo stesso errore quando ho provato la classe ValueTuple al posto di Tuple. – JRB

Problemi correlati