Errore riferimento servizio: impossibile generare il codice per il riferimento servizio


131

Ho una soluzione di servizio di Windows e sto provando ad aggiungere un riferimento di servizio a un servizio Web Hermes (server di messaggi ebms di Opensource) in VS2010.

Posso trovare il servizio Web usando l'URL, ma quando provo a popolare il riferimento al servizio ottengo i seguenti errori in Visual Studio:

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

Alcune indagini sembrano suggerire che a causa del fatto che svcutil.exe non è stato in grado di creare i proxy a causa della mancanza di autorizzazioni per una directory (possibilmente c: \ windows \ temp). Ho provato ad assegnare varie autorizzazioni di accesso, ma non sono sicuro di quale utente abbia bisogno dell'autorizzazione o se si tratta solo di un'aringa rossa.

Qualsiasi idea sarebbe molto apprezzata.

Grazie

Risposte:


303

Deselezionare i tipi di riutilizzo in tutti gli assiemi referenziati dall'opzione Configura riferimento servizio

Controlla questo per i dettagli


3
In alternativa, quando è effettivamente necessario "Riutilizzare i tipi negli assiemi di riferimento", è possibile aggiungere il riferimento del servizio da un progetto Libreria di classi creato appositamente a tale scopo. Controlla la mia risposta per ulteriori informazioni.
Florin Dumitrescu,

Volevo una soluzione senza deselezionare i "tipi di riutilizzo" e sono riuscito a trovarne uno che funzionava, vedi la mia risposta qui .
Shahin Dohan,

Invece di fare qualcosa del genere, usa gli assembly da cui dipende il client WCF invece di usare tutti quelli di riferimento alla cieca, può essere complicato e richiedere più tempo che deselezionare la casella in questione, ma trovo questa soluzione più adatta di quella contrassegnato come risposta.
Oscar Guillamon,

Assicurati anche che il tuo Progetto non sia di sola lettura ... Questo era il mio problema ...
arihanth jain

126

Fare clic con il tasto destro del mouse sul riferimento del servizio e scegliere Configure Service Reference...

Configura riferimento al servizio

Quindi deseleziona Reuse types in referenced assemblies

Riutilizzare i tipi

Fai clic OK, pulisci e ricostruisci la tua soluzione.


2
Cosa succede se devo riutilizzare gli assembly referenziati? Ho un progetto e quella casella è selezionata. L'aggiornamento funziona nella mia macchina, ma sulla macchina di un compagno di lavoro non ... alcun indizio?
Ricardo Appleton,

Questo è successo quando ho aggiornato da v4.6.1 a v4.7 con il mio progetto. Questo l'ha risolto.
Mike Flynn,

17

Ho anche riscontrato un errore simile durante il tentativo di generare il client per un servizio Web da un progetto ASP .Net MVC 4.0 utilizzando Visual Studio 2012.

La radice del problema sembra essere il fatto che il progetto da cui stavo cercando di generare il client faceva riferimento a un assembly che a sua volta dipendeva da un altro assembly a cui non si faceva riferimento.

Quando "Riutilizza i tipi negli assiemi di riferimento" è abilitato nella configurazione del servizio, il generatore di servizi sta probabilmente ispezionando tutti gli assiemi di riferimento per ottenere un elenco di tipi che possono essere riutilizzati. Il fatto che uno degli assiemi di riferimento faccia riferimento a un altro assieme che non è disponibile sta probabilmente causando il guasto del generatore.

Deselezionando "Riutilizza i tipi negli assiemi referenziati" dalle configurazioni di servizio si risolverà il problema sopra riportato , ma c'è un effetto collaterale. L'opzione tipi di riutilizzo è presente per un motivo e in alcuni casi evita il cast non necessario nel codice che utilizza il servizio.

Ad esempio, se il servizio stesso viene creato utilizzando WCF e alcuni parametri di metodi al suo interno sono di tipo System.Guid, verranno tradotti in stringhe nel client generato se l'opzione di riutilizzo dei tipi è disabilitata.

Un'alternativa che preferisco disabilitare i tipi di riutilizzo è quella di aggiungere il riferimento al servizio dal progetto Libreria di classi creato appositamente a tale scopo. L'unica cosa da tenere a mente è copiare tutte le configurazioni relative al servizio dal file app.config della libreria di classi nel file di configurazione del progetto di avvio.

Se ci sono tipi definiti in assembly locali che devono essere riutilizzati nel client di servizio, tali assembly devono semplicemente fare riferimento al progetto della libreria di classi sopra menzionato, insieme a tutte le loro dipendenze.


Strano. Ho cambiato il mio binding da HttpBinding a NetNamedPipeBinding (ho anche aggiunto un endpoint mex) e l'ho trovato nell'assembly client A. Ho creato una nuova classe libary B che faceva riferimento al mio servizio WCF. Quindi ho aggiunto B come riferimento ad A e magicamente tutto funziona di nuovo. Molto strano. Grazie per la soluzione
citronas


1

Sarebbe estremamente difficile indovinare il problema poiché è dovuto a un errore nel WSDL e senza esaminare il WSDL, non posso commentare molto di più. Quindi, se puoi condividere il tuo WSDL, per favore fallo.

Tutto quello che posso dire è che sembra esserci uno schema mancante nel WSDL (con lo spazio dei nomi di destinazione "http://service.ebms.edi.cecid.hku.hk/"). Conosco i problemi e la diversa gestione dello schema quando le istruzioni di inclusione vengono ignorate.

In generale, ho trovato l'implementazione di Microsoft dei servizi Web piuttosto buona, quindi penso che il servizio web stia restituendo WSDL ingannevole.


Grazie Aliostad, proverò a condividere il WSDL quando arrivo dal lavoro.
jheppinstall,

0

Ottengo lo stesso errore in Silverlight 5 (VS2012)

Puoi anche rimuovere i riferimenti a:

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

Dopo aver aggiornato i riferimenti del servizio, assicurati di aggiungerli di nuovo.


0

Come detto sopra, ci sono un paio di problemi diversi possibili. Ciò che abbiamo scoperto è che .DLL per la libreria WCF era stato aggiunto come riferimento al progetto client. Questo, a sua volta, ha creato problemi con la risoluzione degli oggetti e ha quindi "svuotato" i file con passaggi di generazione del codice. Deselezionando l'uso "Riutilizza tipi ..." può sembrare una risposta, crea definizioni extra di tipi di oggetti, che sono proxy dei tipi reali, in un nuovo spazio dei nomi, che quindi causa tutti i tipi di problemi di "compatibilità" con l'uso di questi tipi. Solo se vuoi davvero "nascondere" un tipo dovresti selezionare questa opzione.

Nascondere il tipo sarebbe appropriato quando non si desidera che una dipendenza di tipo "DLL" per "filtrare" in un progetto che si sta tentando di mantenere separato da un altro. Se la DLL per il progetto della libreria WCF si insinua nei riferimenti del progetto client, allora si avrà questo problema con tutti i tipi di strani effetti collaterali poiché le definizioni dei tipi si trovano anche nella DLL.


0

affrontare lo stesso problema, risolto eseguendo Visual Studio in modalità amministratore


0

Ho riscontrato questo problema durante l' aggiornamento di una soluzione VS2010 WCF + Silverlight in VS2015 Professional . Oltre all'aggiornamento automatico da Silverlight 4 a Silverlight 5, il valore della casella di controllo Riutilizzo riferimento servizio è stato modificato e la generazione non è riuscita.


0

"Riutilizzare i tipi" non è sempre il problema quando si verifica questo errore.

Quando aggiungi un riferimento a un servizio precedente, fai clic su "Avanzate" e lì "Aggiungi riferimento Web". Ora link al tuo wsdl e tutto dovrebbe funzionare.


0

Se vuoi correggerlo senza deselezionare la casella di controllo Riutilizzo assieme, questo è ciò che ha funzionato per me:

  • Rimuovere l'assembly di riferimento che si desidera riutilizzare
  • Elimina tutta la cartella bin del progetto
  • Riferimento al servizio di aggiornamento
    • Mantieni "Riutilizza i tipi negli assiemi di riferimento specificati"
  • Aggiungi di nuovo riferimento all'assembly per correggere gli errori
  • Aggiorna di nuovo il riferimento al servizio

0

Il riavvio di Visual Studio ha fatto il trucco per me. Sto usando VS 2015.


-1

Ho avuto questo problema durante il tentativo di aggiornare il mio riferimento al servizio (L'errore si presenta solo quando si aggiunge un riferimento al servizio) ma non volevo rimuovere la casella di controllo riutilizzo dell'assemblaggio.

Ciò che ha funzionato per me è stato il seguente:

  • Rimuovere l'assembly di riferimento che volevo riutilizzare
  • Riferimento al servizio di aggiornamento
  • Mantieni "Riutilizza i tipi negli assiemi di riferimento specificati"
  • Ignora gli errori, è perché manca il riferimento!
  • Aggiungi di nuovo riferimento all'assembly per correggere gli errori
  • Aggiorna di nuovo il riferimento al servizio

Voila, ora in realtà si aggiorna e non prova più a rimuovere tutto il mio codice generato.

Ero quasi pronto a rinunciare alla funzione dei tipi di riutilizzo ...

EDIT: assicurati anche che la configurazione di configurazione sia AnyCPU o x86, poiché svcutil è buggy con x64.

Per il downvoter: mi dispiace se non ha funzionato per te, non so nemmeno perché ha funzionato per me, ma ha funzionato. Potrei aver fatto qualcos'altro quella volta che ha risolto il problema, ma ora non c'è modo di saperlo.

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.