2009-06-05 24 views
5

Estoy desarrollando un servicio wcf como se recomienda here. Resolvió mi problema inicial de conflictos de espacios de nombres al desarrollar el servicio web original .NET 2.0, pero he tenido otro problema.'System.ComponentModel.PropertyChangedEventHandler' no puede derivar de la clase especial 'System.MulticastDelegate'

El objeto que estoy tratando de pasar al servicio wcf se utiliza en el cliente para agregar un montón de información del usuario y algunos de sus campos están vinculados a los controles de la interfaz de usuario (implementando así PropertyChangedEventHandler). Cuando trato de compilar el proxy generado por svcutil en mi proyecto de cliente, obtengo el error que da título a esta pregunta.

Sacar todos los datos de este objeto y ponerlos en una clase para enviar (y luego reconstruir el tipo original) parecería redundante, sin mencionar que llevaría un tiempo ridículamente largo.

¿Hay una solución?

+0

I ' estoy confundido. Usted dice que está desarrollando un servicio WCF, pero luego dice que está desarrollando un servicio web .NET 2.0. WCF es .NET 3.0+, sin embargo. Mi respuesta se basa en .NET 3.0. –

+0

No, inicialmente era un servicio web .NET 2.0, pero el conflicto de espacio de nombres en el servicio web 2.0 estaba complicando el diseño, así que decidí crear un servicio wcf (como se indica en el enlace a mi otra pregunta). Editado para aclarar. –

+0

(respondió al comentario) –

Respuesta

5

¿Lo puedo verificar? ¿Está pasando un delegado a un servicio web? Eso no funcionará ... no se puede serializar. En el mejor de los casos, ADO.NET Data Services (.NET 3.5SP1) puede hacer algo similar al traducir un Expression en una cadena de consulta ... pero eso es lo más cercano que obtendrá. Aparte de eso, deberá crear un objeto de solicitud que encapsule su intención con propiedades regulares.

Esto se aplica a cualquiera de web-servicio, servicio WCF, TCP, etc.

* = un delegado es esencialmente un mango método de tipo seguro (con un objetivo opcional (ejemplo) de referencia); se puede expresar, por ejemplo, como XML


(editar)

De los comentarios - simplemente podría ser que usted no ha atribuido su ficha contratos; esto significa que tiene que inferir el contrato (y a menudo se equivoca). Por ejemplo:

[DataContract] 
class Foo : IWhateverInterfaces { 
    [DataMember] 
    public string Bar {get;set;} 

    [DataMember] 
    public int Baz {get;set;} 

    public float NotPartOfTheContract {get;set;} 

    public event EventHandler AlsoNotPartOfTheContract; 
} 

Al utilizar [DataContract], sólo los miembros marcados [DataMember] son serializados - así que el evento debe ser ignorado. Solía ​​ser el único forma de hacer contratos de datos WCF, pero MS lo modificó para inferir contratos de campos ... un error de OMI, ya que causa el problema que acaba de tener ...

+0

Terminé creando un objeto llamado WCFDocument que era solo los campos sin formato que estaban en mi objeto original (eliminando cualquier enlace de datos etc.) e hice una propiedad en el objeto original que construyó y devolvió un WCFDocument. ... y no, no estaba pasando ningún delegado. La clase base para mi objeto heredado de BindingList e INotifyPropertyChangedEvent. Eso es 2 días seguidos ahora que me has ayudado. De nuevo, gracias Marc. –

+0

Entonces ... si no lo hiciera * explícitamente * pasando un delegado ... Me pregunto si simplemente no está marcando sus contratos de datos WCF correctamente? No pude distinguir nada de la pregunta (ya que no había ningún código ilustrativo). Ver la edición ... –

+0

Esto me ayudó.Tardé un tiempo en determinar el caso, pero tenía UNA única referencia a un tipo real definido en mi wsdl y el resto que había definido como estructuras, etc. Apuesto a que si tuviera más de uno, NUNCA me lo habría imaginado, pero Creé mi propio tipo, hice un dump foreach y lo copié del tipo wsdl y poof funciona. Gracias. – CarComp

Cuestiones relacionadas