Domanda

Sto usando un HashSet nella mia interfaccia WCF

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

Quando creo un riferimento al servizio, HashSet si trasforma in un int [].

Ho aggiunto un ServiceKnownType:

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

e ho provato alcune configurazioni, ma non sono riuscito a farle cambiare.

se lo cambio hard-coded tutto funziona, ma è davvero fastidioso cambiarlo ogni volta che aggiorna il mio riferimento ..

Probabilmente sto facendo qualcosa di sbagliato, qualche suggerimento o idea?

È stato utile?

Soluzione

Le raccolte sono semplificate quando passano sopra il filo. Puoi specificare il tipo di raccolta tramite l'IDE e la riga di comando (svcutil /collectionType), ma si applicherà a tutte raccolte sull'API. Penso che dovresti semplicemente accettarlo e gestire la mancata corrispondenza tramite il codice. Alla fine, sul filo, le raccolte sono solo xml (almeno sui binding standard) - qualcosa del tipo:

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

- quindi perché non riesce a distinguere (dallo schema) tra un array (T[]), un List<T>, un HashSet<T> e un MyFunkyCollection<T>.

Si noti che se si utilizza la condivisione dell'assembly (ovvero lo stesso assembly del contratto di servizio si trova sul server e del client), ciò non accadrà, ma ciò vanifica l'intento di SOA / mex. Ma è un approccio usato parecchio - quindi l'IDE lo supporta direttamente e da riga di comando tramite un interruttore (svcutil /reference).


Per l'IDE che lo supporta ... se si scrive il contratto di servizio e il contratto dati in una libreria di classi (dll) e quindi si aggiunge un riferimento di assembly (ovvero un riferimento dll o un riferimento di progetto) a questa libreria dai due progetti (il progetto server e il progetto client). Ora aggiungi un riferimento di servizio dal progetto client all'endpoint del server (il .svc). Se stai usando VS2008, controllerà automaticamente i riferimenti locali per i tipi e li userà al posto della generazione del proxy - il che significa: il tuo codice client utilizza il IwcfServerSync dalla libreria di classi, che sa già se usare <=> ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top