HashSet in WCF
-
20-08-2019 - |
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?
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.