Cosa significa questo errore WCF: "Avviso strumento personalizzato: impossibile importare wsdl: portType"


84

Ho creato un progetto di libreria di servizi WCF nella mia soluzione e ho riferimenti a questo servizio. Uso i servizi di una libreria di classi, quindi ho riferimenti dal mio progetto di applicazione WPF oltre alla libreria di classi. I servizi vengono configurati in modo semplice, modificati solo per ottenere funzioni di servizio asincrone.

Tutto funzionava bene, fino a quando non ho voluto aggiornare i miei riferimenti di servizio. Non è riuscito, quindi alla fine sono tornato indietro e ho riprovato, ma non è riuscito anche allora! Quindi, l'aggiornamento dei riferimenti al servizio non riesce senza apportare alcuna modifica. Perché?!

L'errore che ricevo è questo:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

L'avviso fornisce ulteriori informazioni:

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']

Ci sono anche due avvisi simili che dicono:

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']  

E lo stesso per:

Custom tool warning: Cannot import wsdl:port .. 

Trovo tutto questo confuso .. Non ho una classe paziente sul dashboard lato client tranne quella che ho ottenuto tramite il riferimento del servizio. Quindi cosa vuol dire? E perché all'improvviso si vede? Ricorda: non ho nemmeno cambiato nulla!

Ora, la soluzione a questo è stata trovata qui , ma senza una spiegazione di cosa significhi. Così; in "Configura riferimento servizio" per il servizio deseleziono la casella di controllo "Riutilizza i tipi negli assembly di riferimento". Ricostruire ora funziona tutto bene senza problemi. Ma cosa ho veramente cambiato? Ciò avrà un impatto sulla mia domanda? E quando si dovrebbe deselezionare questo? Voglio riutilizzare i tipi su cui ho impostato DataContract, ma non di più. Avrò ancora accesso a quelli senza questa verifica?


Ok, c'è una breve spiegazione su msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Ma qualcuno ha una spiegazione migliore? In che modo questo si riferisce ai DataContract che ho impostato?
stiank81

Risposte:


37

Quando si aggiunge un riferimento al servizio, ci sono due modi in cui i tipi utilizzati dal servizio possono essere gestiti:

  • I tipi sono archiviati in una dll e tale dll viene referenziata sia dall'applicazione client che da quella server.
  • I tipi non sono in una DLL a cui fa riferimento il client. In tal caso, lo strumento che crea il riferimento al servizio creerà i tipi nel file references.cs.

Ci sono molte cose che possono andare storte. Abbiamo scoperto che se lo strumento si blocca, a volte è più veloce eliminare il riferimento al servizio e ricominciare.

Abbiamo smesso di utilizzare il riferimento al servizio. Per i progetti in cui abbiamo il controllo del client e del servizio, utilizziamo il metodo descritto in questo screencast .


2
Grazie! In realtà ho trovato quello screencast ieri. L'ho guardato, ed è stato davvero un aprire gli occhi! Ho intenzione di trasferirmi in quella struttura una volta che avrò le basi. Sembra che tu abbia lottato con alcuni degli stessi problemi che sto vedendo. Troppo spesso finisco per cancellare e leggere i riferimenti del servizio quando qualcosa va storto, e questo non è un buon segno .. Spero che l'architettura descritta possa aiutare!
stiank81

Qualcuno è stato in grado di scrivere manualmente il servizio Web quando si utilizza un'associazione PollingDuplex con Silverlight 5?
Richard B

157

Ho trovato la mia risposta qui: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Per farla breve: ho deselezionato Riutilizza i tipi negli assiemi di riferimento dal menu Avanzato .


Non so se è importante, ma non sto usando MVC, ma Web Forms.


2
È richiesto anche un riavvio di VS 2012
George Filippakos

Interessato a guardare, ma il collegamento ora è morto, per favore condividi se lo hai altrove
Chris

1
Funziona in un progetto MVC 3 sotto VS2013 (non è richiesto il riavvio).
Pawel Krakowiak

5
+1 - Solo per riferimento: per apportare questa modifica, fai clic con il pulsante destro del mouse sul riferimento del servizio nel progetto che lo utilizza e seleziona "Configura riferimento servizio ..."
GrandMasterFlush

2
Niente è meglio quindi "per farla breve" :)
Ron

9

Ho avuto anche questo problema oggi. Mi ci è voluto un giorno intero per trovare il mio errore. Spero che sia d'aiuto.

La mia classe che non è stata possibile importare ha una proprietà di tipo enum cutom. Questa proprietà è contrassegnata come DataMember e Enum è anche contrassegnata come DataContract. Finora tutto bene. Ho appena dimenticato di contrassegnare ogni membro di enum come EnumMember.

Quindi sono cambiato

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

A questo:

[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
}

E finalmente ha funzionato!


8

Vai a Proprietà avanzate durante l'aggiunta di riferimento e rimuovere "System.Window.Browser" dalla lista di controllo, risolve il problema.


Grazie! Non usare più i riferimenti ai servizi: eseguire l'approccio manuale descritto nello screencast dalla risposta di @Shiraz. Ma è bello saperlo comunque!
stiank81

8

potrebbe sembrare strano, ma ho risolto il problema eliminando i riferimenti, quindi chiudendo Visual Studio, riaprendolo di nuovo e infine aggiungendo di nuovo i riferimenti.

Penso che la cosa dello strumento personalizzato debba essere riavviata o qualcosa del genere.


2
anche se sei determinato a risolvere il problema SENZA cancellare il riferimento ti consiglio caldamente di creare un NUOVO PROGETTO e di aggiungere il riferimento per vedere se funziona. questo potrebbe rivelare un errore che non vedi nel tuo progetto esistente o potrebbe semplicemente funzionare
Simon_Weaver

4

Mi imbatto costantemente in questo errore mentre funziona su un'altra macchina per sviluppatori. Anche se sono un amministratore completo ovunque nella mia macchina virtuale, ho provato a chiudere Visual Studio e riaprirlo con "Esegui come amministratore" e ha funzionato magicamente.

In bocca al lupo.


2

Ho ricevuto l'avviso dopo aver aggiornato la mia soluzione da Visual Studio (VS) 2010 a 2013 e aver modificato il .NET Framework di ogni progetto da 4 a 4.5.1. Ho chiuso VS e riaperto e gli avvertimenti sono spariti.


Questo mi ha aiutato, ma sono passato da .NET 4.5.2 a 4.6 Gaa!
Jimenemex

1

Uno svantaggio della disattivazione del "riutilizzo dei tipi negli assembly di riferimento" è che può causare problemi con riferimenti ambigui. Ciò è dovuto al fatto che il riferimento al servizio crea nuovamente quegli oggetti nel file .cs di riferimento e il codice che implementa il servizio potrebbe fare riferimento a essi dallo spazio dei nomi originale.

Quando si verifica questo scenario, trovo utile controllare i "tipi di riutilizzo negli assembly di riferimento specificati" che mi consentono di scegliere solo quelli con riferimenti ambigui, il che risolve rapidamente il problema in questo modo.

Spero che aiuti qualcun altro.


0

Le mie interfacce del servizio WCF sono in un assembly, l'implementazione è in un altro e il riferimento al servizio è in un altro assembly, separato dai client del riferimento al servizio. Ho ricevuto il messaggio di errore subito dopo aver applicato DataContract a un'enumerazione. Dopo aver applicato EnumMember ai campi dell'enumerazione, il problema è stato risolto.


0

Se hai dubbi che il tuo servizio non abbia problemi (come problemi con enumerazioni o classi non serializzabili come menzionato da altri), prova a creare un nuovo progetto con un nuovo riferimento.

Sto usando Silverlight 5 e ho provato a cancellare e ricreare il riferimento più volte. Il reference.csfile risultava completamente vuoto ogni volta ed erano passati letteralmente anni da quando l'avevo creato, quindi cercare di capire cosa fosse cambiato nel servizio era fuori questione.

Ho notato che l'errore conteneva riferimenti a 2.0.5.0. Ora non so nemmeno se questo sia effettivamente rilevante per la versione Silverlight, ma mi ha fatto pensare di creare un progetto nuovo di zecca e poi improvvisamente tutto ha funzionato.

Avviso 2 Avviso strumento personalizzato: Impossibile importare wsdl: portType Dettagli: È stata generata un'eccezione durante l'esecuzione di un'estensione di importazione WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Errore: Impossibile caricare il file o l'assembly 'System.Xml, versione = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e 'o una delle sue dipendenze. Il sistema non trova il file specificato. XPath all'origine dell'errore: // wsdl: definition [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']


0

Stavo esaminando il mio progetto e stavo avendo lo stesso problema. Si è scoperto che erano versioni diverse della stessa DLL sul WCF rispetto al sito Web. Il sito Web aveva una versione più recente della DLL e il servizio faceva riferimento a una versione precedente della DLL. Una volta sincronizzati, tutto ha funzionato bene.


0

Ho riscontrato lo stesso errore. Ho lottato per quasi un giorno cercando di scoprire cosa stava andando storto. L'indizio per me erano gli avvertimenti che VS stava lanciando. Stava cercando di fare una sorta di mappatura su Yahoo.Yui.Compressor.dll, una libreria che avevo aggiunto e rimosso (perché avevo deciso di non usarla) un paio di giorni prima. È stato scioccante perché la biblioteca non c'era, ma in qualche modo stava cercando di farvi riferimento.

Infine, ripristino questa DLL dal Cestino e quindi potrei aggiornare correttamente il mio riferimento al servizio.


0

Per chiunque sia qui in futuro, ho avuto lo stesso errore ma causato da problemi di versione, in due modi diversi.

Ho due servizi WCF e due applicazioni client che parlano tramite i riferimenti del servizio. Ho aggiornato un pacchetto nuget su entrambi i lati e ho provato ad aggiornare il riferimento al servizio e ho ricevuto questo errore.

L'eliminazione non ha aiutato. Deselezionare "riutilizza gli assembly" non è desiderato in quanto ho bisogno di riutilizzarli - questo è il punto.

Alla fine, c'erano due questioni separate:

1) Il primo numero, credo, fosse un problema di memorizzazione nella cache di uno studio visivo. Ho esaminato meticolosamente tutti i riferimenti e non ho riscontrato problemi, ma ho comunque segnalato di non essere in grado di trovare la versione precedente del file. Ho disinstallato tutti i pacchetti nuget, riavviato Visual Studio e li ho reinstallati. L'aggiornamento del riferimento del servizio ha funzionato.

2) Il secondo problema è stato causato da un problema di dipendenza. Ho aggiornato il pacchetto nuget su entrambi i lati e tutto sembrava corretto, ma una dipendenza non contrassegnata era fuori sincronia. Esempio:

Il pacchetto Foo v1 fa riferimento a Bar v1. È possibile aggiornare Foo e Bar alla v2 indipendentemente senza aggiornare il riferimento. Se installi sia Foo che Bar v2, lo strumento di riferimento del servizio eseguirà la scansione di Foo v2, vedrai il riferimento a Bar v1 e fallirà perché non riesce a trovare la versione precedente. Questo viene segnalato correttamente solo se aggiorni i numeri di versione della tua dll per ogni pacchetto. Visual Studio e MSBuild non avranno problemi a compilare l'applicazione, ma il riferimento al servizio avrà difficoltà a risolvere tutto.

Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.