2008-08-09 6 views
7

Ich bin immer noch neu in der ASP.NET-Welt, so dass ich hier weit weg von der Basis sein könnte, aber bis jetzt ist dies das Beste aus meinem (begrenzten) Wissen !ASP.NET-Web-Service-Ergebnisse, Proxy-Klassen und Typkonvertierung

Nehmen wir an, ich habe ein Standardgeschäftsobjekt "Kontakt" im Business Namensraum. Ich schreibe einen Webdienst, um die Informationen eines Kontakts aus einer Datenbank abzurufen und zurückzugeben. Ich schreibe dann eine Client-Anwendung, um die Details anzufordern.

Jetzt, ich auch dann eine Dienstprogramm-Methode, die eine "Kontakt" und macht etwas Magie damit, wie Utils.BuyContactNewHat() sagen. Was natürlich der Kontakt vom Typ Business.Contact ist.

ich dann zu meiner Client-Anwendung zurück und will die BuyContactNewHat Methode verwenden, so dass ich hinzufügen, dass es einen Verweis auf meine Utils Namespace und es ist. Es stellt sich jedoch ein Problem mit:

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

Da der Rückgabetyp GetContact von MyWebService.Contact und nicht Business.Contact wie erwartet. Ich verstehe, warum dies so ist, denn beim Zugriff auf einen Webdienst programmieren Sie tatsächlich gegen die von der WSDL generierte Proxyklasse.

Gibt es also einen "einfacheren" Weg, um mit diesem Typenkonflikt umzugehen? Ich überlegte, ob ich vielleicht versuchen sollte, eine generische Konverterklasse zu erstellen, die Reflektion verwendet, um sicherzustellen, dass zwei Objekte die gleiche Struktur haben, als einfach die Werte von einem zum anderen zu übertragen.

Antwort

4

Sie sind auf dem richtigen Weg. Um die Daten vom Proxy-Objekt zurück in eines Ihrer eigenen Objekte zu bekommen, müssen Sie den Links- Rechts-Code verwenden. d.h. kopiere Eigenschaftswerte. Ich wette, dass es bereits eine generische Methode gibt, die Reflektion verwendet.

Einige Leute verwenden etwas anderes als einen Webdienst (.net Remoting), wenn sie nur ein Geschäftsobjekt über die Leitung erhalten wollen. Oder sie verwenden die binäre Serialisierung. Ich nehme an, dass Sie den Web-Service aus einem bestimmten Grund verwenden, also müssen Sie Eigentum kopieren.

4

Sie müssen die generierte Klasse, die die WSDL Ihnen gibt, nicht verwenden. Wenn Sie sich den erzeugten Code anschauen, werden nur einige .NET Framework-Klassen aufgerufen, um SOAP-Anfragen zu senden. In der Vergangenheit habe ich diesen Code in eine normale CS-Datei kopiert und bearbeitet. Obwohl ich dies nicht speziell ausprobiert habe, sehe ich keinen Grund, warum Sie die Proxy-Klassendefinition nicht löschen und die ursprüngliche Klasse verwenden könnten, um die Ergebnisse des SOAP-Aufrufs zu erhalten. Es muss schon Reflektion unter der Haube sein, es ist eine Schande, es zweimal zu tun.

1

Ich würde empfehlen, dass Sie eine Schema-Importer-Erweiterung schreiben, mit der Sie die Proxy-Code-Generierung steuern können. Mit diesem Ansatz können Sie (ohne Probleme) Ihr Problem (elegant) lösen (z. B. das Kopieren von Objekten aus einem Namespace in einen anderen oder das Ändern der generierten referenzierten.c-Klasse, sodass sie beim nächsten Aktualisieren der Webreferenz ersetzt wird).

Hier ist ein (sehr) gutes Tutorial zum Thema:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx