C#:Webservice modifiche tipo di parametro previsto (da un normale POCO per un generata automaticamente classe)
-
09-09-2019 - |
Domanda
Ho il seguente classe in Classe in Libreria: Artist
, che è un POCO
Ora ho un metodo in un web-service (che è un riferimento al citato-libreria di cui sopra) con una firma come questa:
[WebMethod]
public int Artist_AddArtist(Artist a) {
//
}
Quando si tenta di utilizzare questo servizio da un'applicazione (che ha anche un riferimento alla precedenza libreria di classi), il parametro previsto del Artist_AddArtist
il metodo non è Artist
, ma un nuovo tipo di Artist
che viene generato in Reference.cs
che è una classe parziale che è auto-generato.
Quindi, dato che nella mia applicazione, presumibilmente lo stesso Artist
classe dalla libreria e ora il metodo di Servizio Web si aspetta che questa nuova auto generato tipo, non posso passare un'istanza, il servizio web.
Come posso risolvere questo problema?
Soluzione
Forse il passaggio a servizi WCF è un'opzione per voi. Per quanto mi ricordo, con un servizio WCF, è possibile riutilizzare lo stesso tipo sul ther lato server e client.
questo articolo spiega come migrare un servizio ASMX Web per un servizio WCF.
Altri suggerimenti
Non si può, e non deve, a risolvere il problema.
Alcuni altri dicono cose come modificare il file generato, ma che non è una buona pratica (come le modifiche andranno via non appena il Web di Riferimento è aggiornato).
Quello che stai vedendo è il design.Vedere Nozioni di base:Come Servizi Web Di Lavoro.
Brevemente, quando si utilizza la funzione "Aggiungi Riferimento Web", Visual Studio scarica il file WSDL del servizio, e utilizza gli Schemi XML da WSDL per creare alcune classi proxy per rappresentare l'XML descritto dallo schema.Inoltre, crea una classe proxy per il servizio stesso, avendo metodi per ogni operazione in servizio.
I dati del proxy classi di serializzazione in XML che il servizio è in attesa di ricevere, e può essere viene deserializzato XML che il server invia in risposta.
Un modo di pensare di esso è che hai solo questo problema, in quanto sia il client e il servizio sono .NET.Se il tuo client sono stati scritti in Java, quindi non pensare di essere la condivisione di classi.
WCF può fare questo, se necessario.Si introduce una dipendenza tra il client e il servizio (entrambi hanno a utilizzare versioni compatibili dell'assemblea, contenente le classi), ma quando si ha bisogno di farlo, l'opzione c'è.È utile quando c'è un problema in queste classi, che deve essere utilizzato sia dal client e dal servizio.