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.

È stato utile?

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à:

  1. 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.
  2. È 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).

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