Ich habe in meiner Lösung ein WCF-Servicebibliotheksprojekt erstellt und habe Service-Verweise darauf. Ich verwende die Dienste aus einer Klassenbibliothek, daher habe ich zusätzlich zur Klassenbibliothek Referenzen aus meinem WPF-Anwendungsprojekt. Dienste werden einfach eingerichtet - nur geändert, um asynchrone Dienstfunktionen zu erhalten.
Alles hat gut funktioniert - bis ich meine Servicereferenzen aktualisieren wollte. Es ist fehlgeschlagen, also habe ich mich irgendwann zurückgerollt und es erneut versucht, aber es ist auch dann fehlgeschlagen! Das Aktualisieren der Dienstreferenzen schlägt fehl, ohne dass Änderungen daran vorgenommen werden. Warum?!
Der Fehler, den ich bekomme, ist folgender:
Custom tool error: Failed to generate code for the service reference
'MyServiceReference'. Please check other error and warning messages for details.
Die Warnung enthält weitere Informationen:
Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the
following types. Only matching types can be valid references:
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
Es gibt auch zwei ähnliche Warnungen:
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://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']
Und das Gleiche für:
Custom tool warning: Cannot import wsdl:port ..
Ich finde das alles verwirrend. Ich habe keine Patientenklasse auf dem clientseitigen Dashboard außer der, die ich über die Servicereferenz erhalten habe. Was bedeutet das? Und warum zeigt es sich plötzlich? Denken Sie daran: Ich habe nicht einmal etwas geändert!
Nun wurde die Lösung für dieses Problem gefunden hier , aber ohne eine Erklärung zu dem, was das bedeutet. So; Deaktivieren Sie im Kontrollkästchen "Dienstreferenz konfigurieren" für den Dienst das Kontrollkästchen "Wiederverwendungstypen in den referenzierten Assemblys". Der Wiederaufbau funktioniert jetzt problemlos. Aber was habe ich wirklich geändert? Wird sich dies auf meine Bewerbung auswirken? Und wann sollte man das deaktivieren? Ich möchte die Typen, für die ich DataContract eingerichtet habe, wiederverwenden, aber nicht mehr. Bekomme ich trotzdem Zugriff auf diese, ohne dass dies überprüft wurde?
quelle
Antworten:
Wenn Sie eine Dienstreferenz hinzufügen, gibt es zwei Möglichkeiten, wie die vom Dienst verwendeten Typen behandelt werden können:
Es gibt viele Dinge, die schief gehen können. Wir haben festgestellt, dass es manchmal schneller ist, die Dienstreferenz zu löschen und erneut zu starten, wenn das Tool abstürzt.
Wir haben die Verwendung der Servicereferenz eingestellt. Für Projekte, bei denen wir die Kontrolle über den Kunden und den Service haben, verwenden wir die in diesem Screencast beschriebene Methode .
quelle
Ich habe meine Antwort hier gefunden: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html
Lange Rede, kurzer Sinn : Ich habe die Option Wiederverwendungstypen in Referenzbaugruppen im Menü Erweitert deaktiviert .
Ich weiß nicht, ob dies wichtig ist, aber ich verwende nicht MVC, sondern Web Forms.
quelle
Ich hatte auch dieses Problem heute. Ich habe einen ganzen Tag gebraucht, um meinen Fehler zu finden. Ich hoffe es hilft.
Meine Klasse, die nicht importiert werden konnte, hat eine Eigenschaft vom Typ cutom enum type. Diese Eigenschaft ist als DataMember und die Aufzählung auch als DataContract gekennzeichnet. Bisher alles in Ordnung. Ich habe nur vergessen, jedes Enum-Mitglied als EnumMember zu markieren.
Also habe ich mich verändert
Dazu:
Und es hat endlich geklappt!
quelle
Gehen Sie zu Erweiterte Eigenschaften, während Sie eine Referenz hinzufügen, und entfernen Sie "System.Window.Browser" aus der Checkliste. Das Problem wird behoben.
quelle
Das mag seltsam klingen, aber ich habe es behoben, indem ich die Referenzen gelöscht, Visual Studio geschlossen, erneut geöffnet und schließlich die Referenzen erneut hinzugefügt habe.
Ich denke, das benutzerdefinierte Tool musste neu gestartet werden oder so.
quelle
Ich stoße ständig auf diesen Fehler, während er auf einem anderen Entwicklercomputer funktioniert. Obwohl ich überall in meiner virtuellen Maschine ein vollständiger Administrator bin, habe ich versucht, Visual Studio zu schließen und mit "Als Administrator ausführen" erneut zu öffnen, und es hat auf magische Weise funktioniert.
Viel Glück.
quelle
Ich erhielt die Warnung, nachdem ich meine Lösung von Visual Studio (VS) 2010 auf 2013 aktualisiert und das .NET Framework jedes Projekts von 4 auf 4.5.1 geändert hatte. Ich schloss VS und öffnete wieder und die Warnungen gingen weg.
quelle
Ein Nachteil beim Deaktivieren von "Wiederverwendungstypen in Assemblys, auf die verwiesen wird" besteht darin, dass Probleme mit mehrdeutigen Referenzen auftreten können. Dies liegt daran, dass die Dienstreferenz diese Objekte erneut in der Referenz-CS-Datei erstellt und Ihr Code, der den Dienst implementiert, sie möglicherweise aus dem ursprünglichen Namespace referenziert.
Wenn dieses Szenario auftritt, finde ich es nützlich, die "Wiederverwendungstypen in bestimmten Assemblys, auf die verwiesen wird" zu überprüfen, damit ich nur diejenigen mit mehrdeutigen Referenzen auswählen kann, wodurch das Problem auf diese Weise schnell behoben wird.
Hoffe es hilft jemand anderem.
quelle
Meine Schnittstellen des WCF-Dienstes befinden sich in einer Assembly, die Implementierung befindet sich in einer anderen und die Dienstreferenz befindet sich in einer weiteren Assembly, die von den Clients der Dienstreferenz getrennt ist. Ich habe die Fehlermeldung direkt nach dem Anwenden des DataContract auf eine Aufzählung erhalten. Nachdem ich EnumMember auf die Felder der Aufzählung angewendet hatte, wurde das Problem behoben.
quelle
Wenn Sie Zweifel haben, dass Ihr Dienst keine Probleme hat (z. B. Probleme mit Aufzählungen oder nicht serialisierbaren Klassen, wie von anderen erwähnt), versuchen Sie, ein neues Projekt zu erstellen mit einer neuen Referenz .
Ich verwende Silverlight 5 und habe mehrmals versucht, die Referenz zu löschen und neu zu erstellen. Das
reference.cs
Datei war jedes Mal völlig leer und es war buchstäblich Jahre her, seit ich sie erstellt hatte. Es kam also nicht in Frage, herauszufinden, was sich im Service geändert hatte.Ich habe festgestellt, dass der Fehler Verweise auf 2.0.5.0 enthält. Jetzt weiß ich nicht einmal, ob dies tatsächlich für die Silverlight-Version relevant ist, aber ich dachte daran, nur ein brandneues Projekt zu erstellen, und dann funktionierte plötzlich alles.
quelle
Ich habe mir mein Projekt angesehen und hatte das gleiche Problem. Es stellte sich heraus, dass es sich um unterschiedliche Versionen derselben DLL auf der WCF vs. Website handelt. Die Website hatte eine neuere Version der DLL und der Dienst verwies auf eine ältere Version der DLL. Sobald sie alle synchron waren, funktionierten alle gut.
quelle
Ich habe den gleichen Fehler erlebt. Ich hatte fast einen Tag lang Mühe, herauszufinden, was falsch lief. Der Hinweis für mich waren die Warnungen, die VS warf. Es wurde versucht, eine Art Zuordnung zu Yahoo.Yui.Compressor.dll vorzunehmen, einer Bibliothek, die ich einige Tage zuvor hinzugefügt und entfernt hatte (weil ich mich entschieden hatte, sie nicht zu verwenden). Es war schockierend, weil die Bibliothek nicht da war, aber irgendwie versuchte sie, darauf zu verweisen.
Schließlich stelle ich diese DLL aus dem Papierkorb wieder her und konnte dann meine Dienstreferenz erfolgreich aktualisieren.
quelle
Für jeden hier in der Zukunft hatte ich den gleichen Fehler, der jedoch auf zwei verschiedene Arten durch Versionsprobleme verursacht wurde.
Ich habe zwei WCF-Dienste und zwei Clientanwendungen, die über die Dienstreferenzen kommunizieren. Ich habe ein Nuget-Paket auf beiden Seiten aktualisiert und versucht, die Dienstreferenz zu aktualisieren, und habe diesen Fehler erhalten.
Löschen hat nicht geholfen. Das Deaktivieren von "Baugruppen wiederverwenden" ist nicht erwünscht, da ich sie wiederverwenden muss - das ist der springende Punkt.
Am Ende gab es zwei verschiedene Probleme:
1) Die erste Ausgabe war meines Erachtens ein Problem beim Zwischenspeichern von Visual Studios. Ich habe alle Referenzen sorgfältig durchgesehen und keine Probleme festgestellt, aber es wurde immer noch berichtet, dass die vorherige Version der Datei nicht gefunden werden konnte. Ich habe alle Nuget-Pakete deinstalliert, Visual Studio neu gestartet und neu installiert. Das Aktualisieren der Servicereferenz hat funktioniert.
2) Das zweite Problem wurde durch ein Abhängigkeitsproblem verursacht. Ich habe das Nuget-Paket auf beiden Seiten aktualisiert und alles schien korrekt zu sein, aber eine nicht markierte Abhängigkeit war nicht synchron. Beispiel:
Paket Foo v1 verweist auf Bar v1. Es ist möglich, Foo und Bar unabhängig voneinander auf v2 zu aktualisieren, ohne die Referenz zu aktualisieren. Wenn Sie sowohl Foo als auch Bar v2 installieren, scannt das Dienstreferenz-Tool Foo v2, zeigt den Verweis auf Bar v1 an und schlägt fehl, da die ältere Version nicht gefunden werden kann. Dies wird nur korrekt gemeldet, wenn Sie die Versionsnummern Ihrer DLL für jedes Paket aktualisieren. Visual Studio und MSBuild haben kein Problem beim Erstellen der Anwendung, aber die Dienstreferenz wird eine schreckliche Zeit damit haben, alles zu lösen.
Ich hoffe das hilft jemandem.
quelle