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
Deaktivieren Sie in der Option Dienstreferenz konfigurieren die Option Wiederverwendungstypen in allen Assemblys, auf die verwiesen wird
Klicken Sie mit der rechten Maustaste auf Ihre Servicereferenz und wählen Sie Configure Service Reference...
Deaktivieren Sie dann Reuse types in referenced assemblies
Klicken Sie auf OK
, bereinigen Sie Ihre Lösung und erstellen Sie sie neu.
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.
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.
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.
Wenn Sie dies korrigieren möchten, ohne das Kontrollkästchen Assembly wiederverwenden zu deaktivieren, hat dies für mich funktioniert:
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.
das Problem wurde behoben, indem Visual Studio im Administratormodus ausgeführt wurde
Ich erhalte den gleichen Fehler in Silverlight 5 (VS2012)
Sie können auch die Verweise auf Folgendes entfernen:
Stellen Sie nach dem Aktualisieren der Servicereferenzen sicher, dass Sie sie wieder hinzufügen.
Das Neustarten von Visual Studio hat mir geholfen. Ich benutze VS 2015.
"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.
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.
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:
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 ...