2009-06-03 10 views
9

Necesito pasar un objeto personalizado a un servicio web remoto. He leído que puede ser necesario implementar ISerializable, pero lo hice y tengo dificultades. ¿Cuál es la forma correcta en C# para pasar un objeto personalizado a un método de servicio web?C# .NET Web Services: paso de objetos personalizados a un servicio web

+0

Podría ser mejor si pudiera ser específico acerca de las dificultades que está encontrando. ¿Qué estás tratando de hacer realmente? Quizás algunos ejemplos concretos ayuden. ¿Qué quiere decir con "pasar un objeto personalizado"? eso podría significar muchas cosas. Algunos detalles ayudarán. – Cheeso

Respuesta

6

Los objetos suministrados por el usuario como argumentos, como parte de la solicitud de servicio debe estar marcado con [Serializable] y sobre la base de algunas de las respuestas publicadas antes que el mío, también debes asegurarte de que tu objeto personalizado no contenga ningún parámetro en el constructor.

También tenga en cuenta que cualquier lógica que tenga dentro de su clase no se creará en la clase proxy que se crea en el lado del cliente. Todo lo que verá en el lado del cliente es un constructor y propiedades predeterminados. Por lo tanto, si agrega métodos a sus objetos personalizados, tenga en cuenta que el cliente no los verá ni podrá usarlos.

Lo mismo ocurre con cualquier lógica que pueda poner en cualquiera de las propiedades.

Ejemplo

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

Jim, lo siento, pero [Serializable] no tiene nada que ver con los servicios web. –

+0

@John: ¿Por qué no?¿El XmlSerializer tampoco se basa en el atributo [Serializable]? – fretje

+0

Ejemplo agregado. Uso el atributo [Serializable] todo el tiempo cuando necesito serializar un objeto personalizado. –

0

Editar: elimina la parte de [Serializable]

¿Va a crear el servicio, o consumirlo?

Para crear un objeto que se puede pasar como un parámetro de un método web, no tiene que hacer nada especial. Eso es si estás creando un servicio web de asmx.

OTOH, Si está creando un servicio WCF, debe marcar la clase con [DataContract] y todos los miembros que desea serializar con [DataMember].

Si está consumiendo el servicio web, las clases proxy para el objeto que pasa deben generarse cuando agrega la referencia de servicio. Solo tienes que usarlos.

+0

En realidad, estoy haciendo y consumiendo. Lo que has mencionado aquí es lo que he estado haciendo, pero sigo recibiendo quejas de VS sobre la necesidad de un constructor sin parámetros en el objeto personalizado (que he agregado, pero fue en vano). –

+0

puede entonces proporcionar el código relevante y las quejas * exactas * ;-) – fretje

5

Parece que un duplicado de esta question

De todos modos, todos los objetos implicados en las interacciones WS deben ser XML serializable, no ISerializable (que es la serialización binaria). Además, deben describirse en el contrato de servicio (WSDL), de lo contrario, los clientes no podrán consumirlos. This article debería ser útil para comprender la serialización XML con XML Web Services.

Sin embargo, si habla de objetos realmente personalizados (es decir, cualquier tipo). Debería considerar pasarlos en forma binaria: ya sea como codificación base64 o como archivos adjuntos. La pregunta a la que me he vinculado tiene una respuesta sobre cómo hacer eso.

0

Mira esta question para ver cómo implementar la serialización XML para su encargo objetos