Domanda
Esiste un modo durante la creazione di servizi Web per specificare i tipi da utilizzare? In particolare, voglio essere in grado di utilizzare lo stesso tipo sia sul client che sul server per ridurre la duplicazione del codice.
Esempio semplificato:
public class Name
{
public string FirstName {get; set;}
public string Surname { get; set; }
public override string ToString()
{
return string.Concat(FirstName, " ", Surname);
}
}
Non voglio avere ricodificato pezzi di funzionalità nella mia classe. L'altra cosa è che qualsiasi codice esistente che manipola questa classe non funzionerà sul lato client poiché la classe lato client che viene generata sarebbe di un tipo diverso.
Soluzione
Va ??bene, vedo che questa è stata una decisione esplicita di progettazione da parte di SOAP, quindi in realtà non dovresti farlo. Ho trovato la seguente pagina che spiega perché:
I servizi condividono lo schema e il contratto, non di classe . I servizi interagiscono esclusivamente su la loro espressione di strutture attraverso schemi e comportamenti attraverso contratti. Il contratto di servizio descrive la struttura dei messaggi e ordinare i vincoli sopra messaggi. La formalità del espressione consente la verifica automatica dei messaggi in arrivo. Macchina verifica dei messaggi in arrivo ti consente di proteggere il servizio integrità. Contratti e schemi devono rimanere stabili nel tempo, quindi costruendo è flessibile.
Detto questo, ci sono altre due possibilità:
- Genera i riferimenti Web in Visual Studio o utilizzando wsdl.exe. Quindi vai nel file Reference.cs (o .vb) generato ed elimina esplicitamente il tipo. Quindi reindirizzare al tipo desiderato che si trova in un altro assembly.
- È possibile condividere i tipi tra i servizi Web sul lato client tramite wsdl.exe e il parametro / sharetypes.
Altri suggerimenti
Se si desidera condividere un tipo o una struttura tra il servizio Web e il client, aggiungere una struttura pubblica al progetto del servizio Web in questo modo:
public struct Whatever
{
public string A;
public int B;
}
quindi aggiungi un metodo al tuo servizio web che ha questa struttura come tipo di ritorno:
[WebMethod]
public Whatever GiveMeWhatever()
{
Whatever what = new Whatever();
what.A = "A";
what.B = 42;
return what;
}
Dopo aver aggiornato il riferimento web del tuo cliente, sarai in grado di creare strutture di tipo Qualunque cosa nella tua applicazione client in questo modo:
Webreference.Whatever what = new Webreference.Whatever();
what.A = "that works?";
what.B = -1; // FILENOTFOUND
Questa tecnica consente di mantenere la definizione di tutte le strutture necessarie per passare avanti e indietro in un unico posto (il progetto del servizio Web).