2012-08-14 5 views
7

Ich habe einen Web-Service und einen Client. Die in Parametern und Rückgabetypen verwendeten Klassen befinden sich in einer gemeinsamen DLL, die von beiden gemeinsam genutzt wird. Wenn ich jedoch die Webreferenz aktualisiere, erzeugt Visual Studio Kopien der Klassen mit denselben Namen und öffentlichen Eigenschaften und Methoden. Dann wird die Lösung nicht kompiliert, da der Clientcode versucht, die Versionen in der allgemeinen DLL zu verwenden. Ich kann das Problem lösen, indem ich die "doppelten" Klassen jedes Mal lösche, wenn ich die Webreferenz aktualisiere, und eine using-Anweisung hinzufüge, um auf den Namespace der allgemeinen DLL zu zeigen. Gibt es eine Möglichkeit, dies dauerhaft zu beheben?Verhindern Generierung von Proxy-Klassen in Reference.cs beim Hinzufügen/Aktualisieren einer Web-Referenz

UPDATE: Siehe meine Kommentare unten. Dies ist ein "Feature" von asmx Web Services. Es gibt keinen anderen Weg als einen der folgenden: 1) Verwenden Sie eine modernere Art von Web-Service. 2) Verwenden Sie keine gemeinsame DLL 3) Manuell beheben Sie jedes Mal, wenn Sie die Web-Referenz aktualisieren, wie in der ursprünglichen Frage oben.

+1

Entsprechend dieser ähnlichen Frage http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-Adding-a-service-reference, "Reuse Typen" wird nicht unterstützt für "alt Schule "(asmx) Web-Referenzen. – stannius

+0

http://stackoverflow.com/questions/3389679/how-does-visual-studio-2008-and-svcutil-decide-which-types-to-re-use-from-refere – stannius

+0

Sie sollten Ihren Kommentar als hinzufügen Antworten. Ich würde dann upvote. –

Antwort

2

Dies ist eine "Funktion" von asmx Web Services. Es gibt keinen anderen Weg als einen der folgenden :

  • Verwenden Sie eine modernere Art von Web-Service.
  • Verwenden Sie keine gemeinsame DLL
  • Manuell beheben Sie jedes Mal, wenn Sie die Web-Referenz aktualisieren, wie in der ursprünglichen Frage oben.

Quellen: Andere Stackoverflow Fragen:

0

Es gibt keine Möglichkeit, das zu tun.

Allerdings denke ich, dass wir hier ein Designproblem haben. Wenn wir einen Webdienst erstellen, erwarten wir, dass unsere Kunden keine DLL von uns referenzieren müssen. Nur die vom Webservice bereitgestellten Typen sollten für ihre Verwendung ausreichen (bei Webdiensten geht es ausschließlich um Interoperabilität, stellen Sie sich Ihre Clientanwendung in Java vor, Sie können nicht auf die .NET-DLL verweisen).

Aus diesem Grund werden diese Typen erstellt, wenn Sie auf einen Webdienst verweisen. Meiner Meinung nach sollten Sie sich nur auf die Klassen verlassen, die der Webdienst in Ihrer Client-App generiert. Entfernen Sie den Verweis auf die freigegebene DLL aus dem Clientprojekt.

Dies beantwortet Ihre Frage nicht direkt, sondern bietet eine Alternative für Ihr Problem.

+1

Downvoter, bitte geben Sie eine Erklärung für Ihre Stimme ab. Vielen Dank. – Fabio

+0

Meine Vermutung ist, weil es die Frage nicht beantwortet. "Sollte ich das mit einem alten Schuh oder einer Glasflasche einschlagen". – stannius

+0

Ja, @stannius, vielleicht ist das der Grund. Ich habe meine Antwort ein wenig geändert, damit Leute mit "hämmernden Schuhen" sich nicht beschweren können. Übrigens, ich hoffe, meine Antwort war in irgendeiner Weise hilfreich für Sie. – Fabio

1

Ich hatte das gleiche Problem, aber ich hatte es versäumt, die Referenz die korrekte Montage mit den Anfrage/Antwort-Typen in meinem Client hinzuzufügen. Nachdem ich diese Referenz hinzugefügt und sichergestellt hatte, dass das Kontrollkästchen "Typen erneut verwenden" im Dialogfeld "Service-Referenz hinzufügen" aktiviert war, funktionierte es ordnungsgemäß.

+1

-1: Er sagt, dass er "Update Web Reference" verwendet –

1

Im Bereich Klasse gesetzt AnonymousType = false Erzeugungs Klasse mit dem Präfix zu vermeiden, dass sich bei der Web-Referenz Hinzufügen
[System.Xml.Serialization.XmlTypeAttribute (AnonymousType = false)] aber dies nur sicherstellen, dass die Klasse Auto-Gen in Reference.cs die gleiche Struktur wie die Domain-Klasse hat.

Eine Möglichkeit, um dies zu gehen ist Serialisierung/Deserialisierung auf das Domänenobjekt.

Verwandte Themen