2009-06-03 5 views
9

È necessario passare un oggetto personalizzato a un servizio Web remoto. Ho letto che potrebbe essere necessario implementare ISerializable, ma l'ho fatto e sto incontrando difficoltà. Qual è il modo corretto in C# per passare un oggetto personalizzato a un metodo di servizio Web?Servizi Web C# .NET - Passaggio di oggetti personalizzati a un servizio Web

+0

Potrebbe essere meglio se si potesse essere specifico circa le difficoltà che incontrate. Cosa stai cercando di fare, davvero? Forse alcuni esempi concreti potrebbero aiutare. Cosa intendi per "passare un oggetto personalizzato"? questo potrebbe significare molte cose. Alcuni dettagli aiuteranno. – Cheeso

risposta

6

Gli oggetti forniti dall'utente come argomenti, come parte della richiesta del servizio deve essere contrassegnato con [Serializable] e basati su alcune delle risposte postate prima del mio devi anche assicurarti che il tuo oggetto personalizzato non contenga alcun parametro nel costruttore.

Inoltre, tenere presente che qualsiasi logica presente all'interno della classe non verrà creata nella classe proxy creata sul lato client. Tutto ciò che vedrai sul lato client è un costruttore e proprietà predefiniti. Quindi, se aggiungi metodi ai tuoi oggetti personalizzati, tieni presente che il client non li vedrà né sarà in grado di usarli.

La stessa cosa vale per qualsiasi logica si possa inserire in una qualsiasi delle proprietà.

Esempio

[Serializable] 
public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+4

Jim, mi dispiace, ma [Serializable] non ha nulla a che fare con i servizi web. –

+0

@ John: Perché no?XmlSerializer non si basa anche sull'attributo [Serializable]? – fretje

+0

Esempio aggiunto. Uso sempre l'attributo [Serializable] quando è necessario serializzare un oggetto personalizzato. –

0

Edit: rimosso la parte su [Serializable]

Stai creando il servizio o lo consuma?

Per creare un oggetto che può essere passato come parametro di un metodo web, non devi fare nulla di speciale. Questo è se stai creando un webservice asmx.

OTOH, Se si sta creando un servizio WCF, è necessario contrassegnare la classe con [DataContract] e tutti i membri che si desidera serializzare con [DataMember].

Se si utilizza il servizio Web, è necessario generare le classi proxy per il passaggio dell'oggetto quando si aggiunge il riferimento al servizio. Devi solo usarli.

+0

Attualmente sto facendo e consumando. Quello che hai menzionato qui è quello che ho fatto, ma continuo a ricevere lamentele da parte di VS sul fatto di aver bisogno di un costruttore senza parametri nell'oggetto personalizzato (che ho aggiunto, ma senza successo). –

+0

puoi quindi fornire il codice pertinente e i reclami * esatti * ;-) – fretje

5

Sembra un duplicato di questo question

In ogni caso, tutti gli oggetti coinvolti nelle interazioni WS dovrebbero essere XML-serializzabile, non ISerializable (che è la serializzazione binaria). Inoltre, dovrebbero essere descritti nel contratto di servizio (WSDL), altrimenti i clienti non saranno in grado di consumarli. This article dovrebbe essere utile per comprendere la serializzazione XML con servizi Web XML.

Tuttavia, se si sta parlando di oggetti veramente personalizzati (vale a dire qualsiasi tipo). Dovresti considerare di passarli in forma binaria: o come codificati in base64, o come allegati. La domanda a cui mi riferisco ha una risposta su come farlo.

0

Guardate questa question per vedere come implementare la serializzazione XML per oggetti vostra abitudine