Domanda

Ho un servizio Web che sto chiamando da un'applicazione Windows Form (entrambi .NET, entrambi nella stessa soluzione) e vorrei che il mio servizio Web restituisse un oggetto personalizzato da qualsiasi altra parte del progetto - è comune oggetto a cui entrambi condividono un riferimento, poiché si trova nel terzo progetto nella mia soluzione. Quando chiamo il servizio web, restituisce una "Persona" oggetto, ma si trova nello spazio dei nomi del servizio Web ed è creato da una classe proxy che il servizio Web stesso ha generato. Pertanto, non posso manipolarlo e restituirlo al mio programma, che si aspetta una "persona". oggetto basato sulla copia condivisa della classe, non su una copia proxy dallo spazio dei nomi del servizio Web, e viene visualizzato un errore quando provo a digitarlo sul tipo di classe corretto.

Come posso forzare il servizio web a utilizzare una copia locale della classe, non una copia proxy? La mia domanda ha un senso in questo contesto? Altrimenti, lo chiarirò.

Nota: ho fatto ricorso al passaggio di tutti i parametri ByRef e all'uso di quei valori restituiti per popolare una copia dell'oggetto che creo al momento della restituzione. Non può essere il modo migliore per farlo!

È stato utile?

Soluzione

Se si utilizza svcutil.exe per generare un proxy client WCF, è possibile utilizzare / riferimento nella riga di comando per specificare l'assembly contenente la classe comune. Svcutil dovrebbe riutilizzare quella definizione di classe invece di generarne una nuova nello spazio dei nomi proxy del servizio.

Inoltre, funzionerà solo se la tua classe comune è serializzabile e passata per valore (ovvero è esposta come un contratto dati, non come un contratto di servizio).

Altri suggerimenti

Se si utilizza WCF è abbastanza facile utilizzare gli stessi contratti di dati e la stessa interfaccia di servizio tra il cliente e il consumatore. È possibile compilare nella classe proxy generata e modificarla per utilizzare gli spazi dei nomi corretti o utilizzare Classe ChannelFactory per creare un proxy dinamico per te.

La prima soluzione è molto fragile e ti farà modificare la classe proxy ogni volta che cambia l'interfaccia del servizio. La seconda tecnica funziona abbastanza bene e l'abbiamo usata durante un precedente progetto a cui ho lavorato. Con uno di questi metodi è necessario assicurarsi che tutti i chiamanti continuino ad essere aggiornati con l'ultima versione dell'interfaccia.

Dal modo in cui stai descrivendo il problema sembra che tu voglia che il servizio e il client condividano la stessa istanza. Dal momento che WCF serializza e deserializza i tuoi tipi mentre li invii e dal servizio dovresti fare qualcosa di un po 'più intelligente. È questo che intendevi?

Non ne sono sicuro, ma quando compili un servizio web .NET, verrà creato un file DLL che puoi provare a utilizzare per il locale. Ma quando creo applicazioni orientate ai servizi, creo diversi livelli all'interno della mia soluzione, ad esempio Livello accesso dati, Livello logico, Livello servizio, Livello interfaccia utente, Livello controller e, ad esempio, nel livello Controller, eseguirò un metodo di autenticazione utente che è collegato con il livello di accesso ai dati e il livello di logica e quindi chiamerò quel metodo sul livello di servizio e posso anche chiamarlo sul livello dell'interfaccia utente e se lo chiamo dall'interno del livello dell'interfaccia utente, viene chiamato localmente, quando voglio usarlo dal livello di servizio, creerò un metodo web usando quel metodo che restituirà un bool, un nome utente ecc.

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