Was bedeutet dieser WCF-Fehler: "Warnung zum benutzerdefinierten Tool: wsdl: portType kann nicht importiert werden"

84

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?

stiank81
quelle
Ok, es gibt eine kurze Erklärung zu msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Aber hat jemand eine bessere Erklärung? Wie bezieht sich dies auf die von mir eingerichteten DataContracts?
stiank81

Antworten:

37

Wenn Sie eine Dienstreferenz hinzufügen, gibt es zwei Möglichkeiten, wie die vom Dienst verwendeten Typen behandelt werden können:

  • Die Typen werden in einer DLL gespeichert, und auf diese DLL wird sowohl vom Client als auch von der Serveranwendung verwiesen.
  • Die Typen befinden sich nicht in einer DLL, auf die der Client verweist. In diesem Fall erstellt das Tool, das die Dienstreferenz erstellt, die Typen in der Datei reference.cs.

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 .

Shiraz Bhaiji
quelle
2
Vielen Dank! Ich habe diesen Screencast gestern tatsächlich gefunden. Habe es gesehen und es war wirklich ein Augenöffner! Ich plane, zu dieser Struktur zu wechseln, sobald ich die Grundlagen vermittelt habe. Klingt so, als hätten Sie mit einigen der gleichen Probleme zu kämpfen, die ich sehe. Ich lösche und lese zu oft die Dienstreferenzen, wenn etwas seltsam schief geht, und das ist kein gutes Zeichen. Ich hoffe, die beschriebene Architektur hilft!
stiank81
Konnte jemand den Webdienst von Hand schreiben, wenn Sie eine PollingDuplex-Bindung mit Silverlight 5 verwenden?
Richard B
157

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.

Dragos Durlut
quelle
2
Ein Neustart von VS 2012 ist ebenfalls erforderlich
George Filippakos
Interessiert zu sehen, aber der Link ist jetzt tot, bitte teilen Sie, wenn Sie es woanders haben
Chris
1
Funktioniert in einem MVC 3-Projekt unter VS2013 (kein Neustart erforderlich).
Pawel Krakowiak
5
+1 - Nur als Referenz: Um diese Änderung vorzunehmen, klicken Sie mit der rechten Maustaste auf die Dienstreferenz in dem Projekt, das sie verwendet, und wählen Sie "Dienstreferenz konfigurieren ..."
GrandMasterFlush
2
Nichts ist besser als "lange
Ron
9

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

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

Dazu:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

Und es hat endlich geklappt!

Aurel
quelle
8

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.

Sridhar Subramanian
quelle
Vielen Dank! Verwenden Sie keine Servicereferenzen mehr - führen Sie den im Screencast anhand der Antwort von @Shiraz beschriebenen manuellen Ansatz aus. Aber das ist trotzdem schön zu wissen!
stiank81
8

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.

Ateik
quelle
2
Selbst wenn Sie entschlossen sind, das Problem herauszufinden, OHNE die Referenz zu löschen, empfehle ich dringend, ein NEUES PROJEKT zu erstellen und die Referenz hinzuzufügen, um zu prüfen, ob es funktioniert. Dies kann einen Fehler aufdecken, den Sie in Ihrem bestehenden Projekt nicht sehen, oder es kann einfach funktionieren
Simon_Weaver
4

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.

Tim Gabrhel
quelle
2

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.

Paul Berglund
quelle
Das hat mir geholfen, aber ich habe von .NET 4.5.2 auf 4.6 Gaa gewechselt!
Jimenemex
1

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.

John
quelle
0

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.

zsolt világos
quelle
0

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. Dasreference.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.

Warnung 2 Benutzerdefinierte Tool-Warnung: wsdl: portType kann nicht importiert werden Detail: Beim Ausführen einer WSDL-Importerweiterung wurde eine Ausnahme ausgelöst: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Fehler: Datei oder Assembly 'System.Xml, Version = 2.0.5.0, konnte nicht geladen werden. Kultur = neutral, PublicKeyToken = 7cec85d7bea7798e 'oder eine seiner Abhängigkeiten. Die angegebene Datei wurde vom System nicht gefunden. XPath to Error Quelle: // wsdl: Definitionen [@targetNamespace = ''] / wsdl: Port Typ [@ name = 'IShoppingCart']

Simon_Weaver
quelle
0

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.

CBBSpike
quelle
0

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.

cdiaz
quelle
0

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.

TheMightyGherkin
quelle