Frage

Ich bin noch neu in der ASP.NET-Welt, daher könnte ich hier weit daneben liegen, aber bisher ist dies nach meinem besten (begrenzten) Wissen!

Nehmen wir an, ich habe ein Standard-Geschäftsobjekt „Kontakt“ im Geschäft Namensraum.Ich schreibe einen Webdienst, um die Informationen eines Kontakts aus einer Datenbank abzurufen und zurückzugeben.Ich schreibe dann einen Kundenantrag, um diese Details anzufordern.

Jetzt erstelle ich auch eine Hilfsmethode, die einen „Kontakt“ annimmt und damit etwas Zauberhaftes anwendet Utils.BuyContactNewHat() sagen.Was natürlich den Kontakttyp erfordert Business.Contact.

Ich gehe dann zurück zu meiner Client-Anwendung und möchte sie nutzen BuyContactNewHat Methode, also füge ich einen Verweis auf meine hinzu Dienstprogramme Namespace und da ist es.Allerdings tritt ein Problem auf bei:

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

Da der Rückgabetyp von GetContact ist von MyWebService.Contact und nicht Business.Contact wie erwartet.Ich verstehe den Grund dafür, weil Sie beim Zugriff auf einen Webdienst tatsächlich gegen die von der WSDL generierte Proxy-Klasse programmieren.

Gibt es also eine „einfachere“ Möglichkeit, mit dieser Art von Nichtübereinstimmung umzugehen?Ich habe darüber nachgedacht, vielleicht zu versuchen, eine generische Konverterklasse zu erstellen, die mithilfe von Reflektion sicherstellt, dass zwei Objekte dieselbe Struktur haben, anstatt einfach die Werte von einem zum anderen zu übertragen.

War es hilfreich?

Lösung

Du bist auf dem richtigen Weg.Um die Daten vom Proxy-Objekt zurück in eines Ihrer eigenen Objekte zu übertragen, müssen Sie Links-Rechts-Code ausführen.d.h.Eigenschaftswerte kopieren.Ich wette, dass es bereits eine generische Methode gibt, die Reflektion nutzt.

Manche Leute verwenden etwas anderes als einen Webdienst (.net-Remoting), wenn sie nur ein Geschäftsobjekt über das Kabel übertragen möchten.Oder sie verwenden die binäre Serialisierung.Ich vermute, dass Sie den Webdienst aus einem bestimmten Grund nutzen, also müssen Sie die Eigenschaften kopieren.

Andere Tipps

Sie müssen nicht unbedingt die generierte Klasse verwenden, die Ihnen die WSDL zur Verfügung stellt.Wenn Sie sich den von ihm generierten Code ansehen, werden lediglich Aufrufe an einige .NET Framework-Klassen ausgeführt, um SOAP-Anforderungen zu senden.In der Vergangenheit habe ich diesen Code in eine normale CS-Datei kopiert und bearbeitet.Obwohl ich dies nicht speziell versucht 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 empfangen.Unter der Haube muss es bereits Nachdenken geben, es scheint eine Schande, es zweimal zu tun.

Ich würde Ihnen empfehlen, eine Schema-Importer-Erweiterung zu schreiben, mit der Sie die Proxy-Code-Generierung steuern können.Dieser Ansatz kann verwendet werden, um Ihr Problem (anmutig) ohne Umständlichkeit zu lösen (z. B. das Kopieren von Objekten von einem Namespace in einen anderen oder das Ändern der vom Proxy generierten reference.cs-Klasse, um sie bei der nächsten Aktualisierung der Webreferenz zu ersetzen).

Hier ist ein (sehr) gutes Tutorial zu diesem Thema:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top