wake-up-neo.com

Servicereferenzfehler: Fehler beim Generieren des Codes für die Servicereferenz

Ich habe eine Windows-Dienstlösung und versuche, einen Dienstverweis auf einen Hermes-Webdienst (Opensource ebms message server) in VS2010 hinzuzufügen.

Ich kann den Webdienst anhand seiner URL finden, aber wenn ich versuche, die Dienstreferenz aufzufüllen, werden in Visual Studio die folgenden Fehler angezeigt:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Einige Untersuchungen schienen darauf hinzudeuten, dass svcutil.exe die Proxys aufgrund fehlender Berechtigungen für ein Verzeichnis (möglicherweise c:\windows\temp) nicht erstellen konnte. Ich habe versucht, verschiedene Zugriffsberechtigungen zuzuweisen, bin mir jedoch nicht sicher, welcher Benutzer die Berechtigung benötigt oder ob es sich nur um einen roten Hering handelt.

Irgendwelche Ideen wären sehr dankbar.

Vielen Dank

130
jheppinstall

Deaktivieren Sie in der Option Dienstreferenz konfigurieren die Option Wiederverwendungstypen in allen Assemblys, auf die verwiesen wird

Überprüfen Sie dies für Details

295
smhnkmr

Klicken Sie mit der rechten Maustaste auf Ihre Servicereferenz und wählen Sie Configure Service Reference...

Configure Service Reference

Deaktivieren Sie dann Reuse types in referenced assemblies

Reuse Types

Klicken Sie auf OK, bereinigen Sie Ihre Lösung und erstellen Sie sie neu.

122
Darren

Beim Versuch, den Client für einen Webdienst aus einem ASP .Net MVC 4.0-Projekt mit Visual Studio 2012 zu generieren, ist ein ähnlicher Fehler aufgetreten.

Die Ursache des Problems scheint in der Tatsache zu liegen, dass das Projekt, aus dem ich den Client generieren wollte, auf eine Assembly verwies, die wiederum von einer anderen Assembly abhängig war, auf die nicht ebenfalls verwiesen wurde.

Wenn "Typen in referenzierten Assemblys wiederverwenden" in der Servicekonfiguration aktiviert ist, überprüft der Service-Generator wahrscheinlich alle referenzierten Assemblys, um eine Liste der Typen zu erhalten, die wiederverwendet werden können. Die Tatsache, dass eine der Assemblys, auf die verwiesen wird, auf eine andere Assembly verweist, die nicht verfügbar ist, führt wahrscheinlich zum Ausfall des Generators.

Deaktivieren Sie "Typen in Assemblys, auf die verwiesen wird, wiederverwenden" in den Dienstkonfigurationen löst das oben genannte Problem, aber es gibt einen Nebeneffekt. Die Option für Wiederverwendungstypen gibt es aus einem bestimmten Grund und in einigen Fällen wird vermieden, dass der Code, der den Service verbraucht, unnötig umgewandelt wird.

Wenn der Dienst selbst beispielsweise mit WCF erstellt wurde und einige Methodenparameter vom Typ System.Guid sind, werden sie im generierten Client in Zeichenfolgen übersetzt, wenn die Option für Wiederverwendungstypen deaktiviert ist.

Eine von mir bevorzugte Alternative zum Deaktivieren der Wiederverwendung von Typen ist das Hinzufügen der Dienstreferenz aus dem speziell für diesen Zweck erstellten Klassenbibliotheksprojekt. Beachten Sie, dass alle dienstbezogenen Konfigurationen aus der app.config der Klassenbibliothek in die Konfigurationsdatei des Startprojekts kopiert werden müssen.

Wenn in lokalen Assemblys Typen definiert sind, die im Service-Client wiederverwendet werden müssen, müssen diese Assemblys lediglich aus dem oben genannten Klassenbibliotheksprojekt mit all ihren Abhängigkeiten referenziert werden.

16

http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

Danke an den obigen Artikel.

In meinem Fall habe ich dieses Problem mit meinem WPF-Projekt in VS.Net 2008. Nachdem ich diesen Artikel durchgesehen habe, wurde mir klar, dass die im Webdienst verwendete Assembly eine andere Version der auf dem Client verwendeten Assembly ist.

Es funktioniert einwandfrei, nachdem die Assembly auf dem Client aktualisiert wurde.

3
user2144589

Es wäre äußerst schwierig, das Problem zu erraten, da es auf einen Fehler in der WSDL und zurückzuführen ist, ohne die WSDL zu untersuchen. Mehr kann ich nicht sagen. Wenn Sie also Ihre WSDL teilen können, tun Sie dies bitte.

Ich kann nur sagen, dass in der WSDL anscheinend ein Schema fehlt (mit dem Zielnamespace 'http://service.ebms.edi.cecid.hku.hk/'). Ich kenne Probleme und die unterschiedliche Behandlung des Schemas, wenn Include-Anweisungen ignoriert werden.

Im Allgemeinen fand ich die Implementierung von Webdiensten durch Microsoft ziemlich gut, und ich denke, der Webdienst sendet zweifelhafte WSDL zurück.

1
Aliostad

Wenn Sie dies korrigieren möchten, ohne das Kontrollkästchen Assembly wiederverwenden zu deaktivieren, hat dies für mich funktioniert:

  • Entfernen Sie die referenzierte Assembly, die Sie wiederverwenden möchten
  • Löschen Sie den gesamten Bin-Ordner des Projekts
  • Servicereferenz aktualisieren
    • Behalten Sie "Wiederverwendungstypen in angegebenen Assemblys, auf die verwiesen wird" bei.
  • Fügen Sie erneut einen Verweis auf Assembly hinzu, um die Fehler zu beheben
  • Aktualisieren Sie die Servicereferenz erneut
0
popiandro

Wie oben erwähnt, sind verschiedene Probleme möglich. Wir haben festgestellt, dass die .DLL für die WCF-Bibliothek als Verweis auf das Clientprojekt hinzugefügt wurde. Dies verursachte wiederum Probleme beim Auflösen der Objekte und verursachte somit, dass die Dateien durch Codegenerierungsschritte "geleert" wurden. Während das Deaktivieren der Option "Typen wiederverwenden ..." als Antwort erscheinen kann, werden in einem neuen Namensraum zusätzliche Definitionen von Objekttypen erstellt, die stellvertretend für die tatsächlichen Typen stehen die Verwendung dieser Typen. Nur wenn Sie einen Typ wirklich "verstecken" möchten, sollten Sie diese Option aktivieren.

Das Ausblenden des Typs ist dann sinnvoll, wenn keine Abhängigkeit vom Typ "DLL" in ein Projekt "eindringen" soll, das von einem anderen getrennt werden soll. Wenn sich das DLL für das WCF-Bibliotheksprojekt in die Clientprojektreferenzen einschleicht, tritt dieses Problem bei allen Arten von seltsamen Nebenwirkungen auf, da sich die Typdefinitionen auch in der DLL befinden.

0
Grwon

das Problem wurde behoben, indem Visual Studio im Administratormodus ausgeführt wurde

0
Prashant

Ich erhalte den gleichen Fehler in Silverlight 5 (VS2012)

Sie können auch die Verweise auf Folgendes entfernen:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

Stellen Sie nach dem Aktualisieren der Servicereferenzen sicher, dass Sie sie wieder hinzufügen.

0
CartoJunkie

Das Neustarten von Visual Studio hat mir geholfen. Ich benutze VS 2015.

0
CodingYoshi

"Wiederverwendungstypen" ist nicht immer das Problem, wenn dieser Fehler auftritt.

Wenn Sie einen Verweis auf einen älteren Dienst hinzufügen, klicken Sie auf "Erweitert" und dort auf "Webverweis hinzufügen". Verlinke jetzt deine wsdl und alles sollte funktionieren.

0
FrankyHollywood

Ich habe dieses Problem festgestellt, als pgrade einer VS2010 WCF + Silverlight-Lösung in VS2015 Professional. Neben der automatischen Aktualisierung von Silverlight 4 auf Silverlight 5 wurde das Kontrollkästchen für die Wiederverwendung von Dienstreferenzen geändert und die Generierung schlug fehl.

0
Alexei

Ich hatte dieses Problem beim Versuch, meine Servicereferenz zu aktualisieren (der Fehler wird jedoch nur beim Hinzufügen einer Servicereferenz angezeigt), wollte aber das Kontrollkästchen Wiederverwendung der Baugruppe nicht entfernen.

Was bei mir funktioniert hat war folgendes:

  • Entfernen Sie die referenzierte Assembly, die ich wiederverwenden wollte
  • Servicereferenz aktualisieren
    • Behalten Sie "Wiederverwendungstypen in angegebenen Assemblys, auf die verwiesen wird" bei.
    • Ignoriere die Fehler, weil die Referenz fehlt!
  • Fügen Sie erneut einen Verweis auf Assembly hinzu, um die Fehler zu beheben
  • Aktualisieren Sie die Servicereferenz erneut

Voila, jetzt wird es tatsächlich aktualisiert und versucht nicht mehr, meinen gesamten generierten Code zu entfernen.

Ich war fast bereit, auf die Wiederverwendung von Typen zu verzichten ...

0
Shahin Dohan