2009-06-05 6 views
5

Ich entwickle einen WCF-Dienst wie empfohlen here. Es löste mein erstes Problem von Namespace-Konflikten beim Entwickeln des ursprünglichen .NET 2.0-Webdienstes, aber ich bin auf ein anderes Problem gestoßen.'System.ComponentModel.PropertyChangedEventHandler' kann nicht von der speziellen Klasse 'System.MulticastDelegate' abgeleitet werden

Das Objekt, das ich an den WCF-Dienst übergeben möchte, wird im Client verwendet, um eine Reihe von Informationen vom Benutzer zu sammeln, und einige seiner Felder sind mit ui-Steuerelementen verbunden (wodurch PropertyChangedEventHandler implementiert wird). Wenn ich versuche, den Proxy zu kompilieren, der von SVCUTIL in meinem Client-Projekt generiert wird, erhalte ich den Fehler, der diese Frage titelt.

Das Herausziehen aller Daten aus diesem Objekt und das Einfügen in eine Klasse zum Senden (und dann Rekonstruieren des Originaltyps) erscheint redundant - ganz zu schweigen von einer unglaublich langen Zeit.

Gibt es eine Problemumgehung?

+0

I ' bin verwirrt. Sie sagen, dass Sie einen WCF-Dienst entwickeln, aber dann sagen Sie, dass Sie einen .NET 2.0-Webdienst entwickeln. WCF ist jedoch .NET 3.0+. Meine Antwort basiert auf .NET 3.0. –

+0

Nein, anfangs war es ein .NET 2.0-Webdienst, aber der Namespace-Konflikt im 2.0-Webdienst verkomplizierte den Entwurf. Daher entschloss ich mich stattdessen, einen wcf-Dienst zu erstellen (wie im Link zu meiner anderen Frage angegeben). Bearbeitet, um zu klären. –

+0

(geantwortet auf Kommentar) –

Antwort

5

Kann ich überprüfen? Übergeben Sie einen Delegierten an einen Webdienst? Das wird nicht funktionieren ... es kann nicht serialisiert werden. Im besten Fall können ADO.NET Data Services (.NET 3.5SP1) etwas Ähnliches tun, indem sie eine Expression in eine Query-Zeichenkette übersetzen ... aber das ist so nah wie möglich. Abgesehen davon müssen Sie ein Anforderungsobjekt erstellen, das Ihre Absicht mit regulären Eigenschaften kapselt.

Dies gilt von einem Web-Service, WCF-Dienst, TCP usw.

* = a delegieren ist im Wesentlichen eine typsichere Methode Griff (mit einem optionalen Ziel (instance) Referenz); es kann zum Beispiel ausgedrückt werden als XML


(edit)

Aus den Kommentaren - es könnte einfach sein, dass Sie nicht auf Ihre Daten-Verträge zurückzuführen sind; das heißt, es muss auf den Vertrag schließen (und es wird oft falsch verstanden). Zum Beispiel:

[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; 
} 

Wenn [DataContract] verwenden, markiert nur Mitglieder [DataMember] serialisiert werden - so sollte das Ereignis ignoriert werden. Dies war die nur Art der WCF Daten-Verträge zu tun, aber MS zwickte es Verträge aus Feldern zu schließen ... ein Fehler IMO, wie es das Problem verursacht, das Sie gerade hatten ...

+0

Ich endete beim Erstellen eines Objekts mit dem Namen WCFDocument, das waren nur die rohen Felder, die in meinem ursprünglichen Objekt waren (Entfernen von Datenbindung usw.) und eine Eigenschaft im ursprünglichen Objekt erstellt und das ein WCFDocument zurückgegeben. ... und nein, ich gab keine Delegierten weiter. Die Basisklasse für mein Objekt, die von BindingList und INotifyPropertyChangedEvent geerbt wurde. Das ist 2 Tage in Folge, jetzt, wo Sie mir geholfen haben. Nochmals vielen Dank, Marc. –

+0

Also ... wenn Sie nicht * explizit * einen Delegierten übergeben ... Ich frage mich, ob Sie Ihre WCF-Datenverträge nicht korrekt markieren? Ich konnte aus der Frage nichts sagen (da es keinen illustrativen Code gab). Siehe bearbeiten ... –

+0

Das hat mir geholfen.Es dauerte eine Weile, um den Fall zu bestimmen, aber ich hatte einen einzigen Verweis auf einen tatsächlichen Typ in meiner WSDL definiert und den Rest, den ich als Strukturen usw. definiert hatte. Ich wette, wenn ich mehr als einen hätte, hätte ich das nie herausgefunden Ich habe meinen eigenen Typ erstellt, einen dump foreach gemacht und ihn vom wsdl-Typ kopiert und es funktioniert. Vielen Dank. – CarComp

Verwandte Themen