Error de referencia de servicio: no se pudo generar código para la referencia de servicio

131

Tengo una solución de servicio de Windows y estoy tratando de agregar una referencia de servicio a un servicio web Hermes (Opensource ebms message server) en VS2010.

Puedo encontrar el servicio web usando su URL, pero cuando intento completar la referencia del servicio, obtengo los siguientes errores en 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

Algunas investigaciones parecen sugerir que se debe a que svcutil.exe no ha podido construir los servidores proxy debido a que no tiene permisos para un directorio (posiblemente c: \ windows \ temp). He intentado asignar varios permisos de acceso, pero no estoy realmente seguro de qué usuario necesita el permiso, o si es solo una pista falsa.

Cualquier idea sería muy apreciada.

Gracias

jheppinstall
fuente

Respuestas:

303

Debe desmarcar los tipos de Reutilización en todos los ensamblados a los que se hace referencia en la opción Configurar referencia de servicio

Mira esto para más detalles

Mohan
fuente
3
Alternativamente, cuando realmente se necesita "Reutilizar tipos en ensamblados referenciados", puede agregar la referencia de servicio desde un proyecto de Biblioteca de clases creado específicamente para ese propósito. Consulte mi respuesta para obtener información adicional.
Florin Dumitrescu
Quería una solución sin desmarcar "tipos de reutilización", y logré encontrar una que funcionara, vea mi respuesta aquí .
Shahin Dohan
En lugar de hacer algo como esto, use los ensamblajes de los que depende el cliente WCF en lugar de usar todos los referenciados a ciegas. Puede ser complicado y requerir más tiempo que desmarcar la casilla de verificación en cuestión, pero creo que esta solución es más adecuada que la anterior. marcado como respuesta
Oscar Guillamon
También asegúrese de que su proyecto no sea de solo lectura ... Este fue mi problema ...
arihanth jain
126

Haga clic derecho en su referencia de servicio y elija Configure Service Reference...

Configurar referencia de servicio

Luego desmarque Reuse types in referenced assemblies

Tipos de reutilización

Haga clic OK, limpie y reconstruya su solución.

Darren
fuente
2
¿Qué sucede si necesito reutilizar los ensambles a los que se hace referencia? Tengo un proyecto y esa casilla está marcada. La actualización funciona en mi máquina, pero en la máquina de un compañero de trabajo no ... ¿alguna pista?
Ricardo Appleton
Esto sucedió cuando actualicé de v4.6.1 a v4.7 con mi proyecto. Esto lo solucionó.
Mike Flynn
17

También encontré un error similar al intentar generar el cliente para un servicio web desde un proyecto ASP .Net MVC 4.0 usando Visual Studio 2012.

La raíz del problema parece ser el hecho de que el proyecto desde el que intentaba generar el cliente hacía referencia a un ensamblaje que a su vez dependía de otro ensamblaje al que no se hacía referencia también.

Cuando "Reutilizar tipos en conjuntos referenciados" está habilitado en la configuración del servicio, el generador de servicios probablemente esté inspeccionando todos los conjuntos referenciados para obtener una lista de tipos que pueden reutilizarse. El hecho de que uno de los conjuntos a los que se hace referencia haga referencia a otro conjunto que no está disponible probablemente esté causando el fallo del generador.

Desmarcar "Reutilizar tipos en conjuntos referenciados" de las configuraciones de servicio resolverá el problema anterior , pero hay un efecto secundario. La opción de reutilizar tipos está ahí por una razón y, en algunos casos, evita la conversión innecesaria en el código que consume el servicio.

Por ejemplo, si el servicio en sí se construye usando WCF y algunos parámetros de métodos dentro de él son del tipo System.Guid, se traducirán a cadenas en el cliente generado si la opción de reutilizar tipos está deshabilitada.

Una alternativa que prefiero deshabilitar los tipos de reutilización es agregar la referencia de servicio del proyecto Biblioteca de clases creado específicamente para ese propósito. Lo único que debe tener en cuenta es copiar todas las configuraciones relacionadas con el servicio de la aplicación app.config de la biblioteca de clases al archivo de configuración del proyecto de inicio.

Si hay tipos definidos en ensamblajes locales que deben reutilizarse en el cliente de servicio, simplemente es necesario hacer referencia a esos ensamblados del proyecto de biblioteca de clases mencionado anteriormente, junto con todas sus dependencias.

Florin Dumitrescu
fuente
Extraño. Cambié mi enlace de HttpBinding a NetNamedPipeBinding (también agregué un punto final mex) y estimulé esto en mi ensamblado de cliente A. Creé una nueva biblioteca de clase B que hacía referencia a mi servicio WCF. Luego agregué B como referencia a A y mágicamente todo funciona de nuevo. Muy extraño. Gracias por la solución
citronas
1

Sería extremadamente difícil adivinar el problema ya que se debe a un error en el WSDL y sin examinar el WSDL, no puedo comentar mucho más. Entonces, si puede compartir su WSDL, hágalo.

Todo lo que puedo decir es que parece que falta un esquema en el WSDL (con el espacio de nombres de destino 'http://service.ebms.edi.cecid.hku.hk/'). Sé acerca de los problemas y el manejo diferente del esquema cuando se ignoran las instrucciones de inclusión.

En general, he encontrado que la implementación de servicios web de Microsoft es bastante buena, así que creo que el servicio web está enviando un WSDL poco fiable.

Aliostad
fuente
Gracias Aliostad, intentaré compartir el WSDL cuando llegue del trabajo.
jheppinstall
0

Me sale el mismo error en Silverlight 5 (VS2012)

También puede eliminar las referencias a:

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

Después de actualizar las referencias de servicio, asegúrese de agregarlas nuevamente.

CartoJunkie
fuente
0

Como se indicó anteriormente, hay un par de posibles problemas diferentes. Lo que encontramos es que el .DLL para la biblioteca WCF se había agregado como referencia al proyecto del cliente. Esto, a su vez, creó problemas para resolver los objetos y, por lo tanto, provocó que los archivos se "vaciaran" mediante pasos de generación de código. Si bien desmarcar el uso "Reutilizar tipos ..." puede parecer una respuesta, crea definiciones adicionales de los tipos de objeto, que son representantes de los tipos reales, en un nuevo espacio de nombres, lo que provoca todo tipo de problemas de "compatibilidad" con El uso de esos tipos. Solo si realmente desea "ocultar" un tipo, debe marcar esta opción.

Ocultar el tipo sería apropiado cuando no desea que una dependencia de tipo "DLL" se "filtre" en un proyecto que está tratando de mantener separado de otro. Si la DLL para el proyecto de la biblioteca WCF se desliza en las referencias del proyecto del cliente, entonces tendrá este problema con todo tipo de efectos secundarios extraños ya que las definiciones de tipo también están en la DLL.

Grwon
fuente
0

enfrentar el mismo problema, resuelto ejecutando Visual Studio en modo Administrador

Prasante
fuente
0

He encontrado este problema al actualizar una solución VS2010 WCF + Silverlight en VS2015 Professional . Además de actualizar automáticamente de Silverlight 4 a Silverlight 5, el valor de la casilla de verificación de reutilización de referencia de servicio cambió y la generación falló.

Alexei
fuente
0

"Reutilizar tipos" no siempre es el problema cuando se produce este error.

Al agregar una referencia a un servicio anterior, haga clic en 'avanzado' y allí 'Agregar referencia web'. Ahora enlace a su wsdl y todo debería estar funcionando.

FrankyHollywood
fuente
0

Si desea corregir esto sin desmarcar la casilla de verificación de reutilización de ensamblaje, esto es lo que funcionó para mí:

  • Elimine el ensamblaje referenciado que desea reutilizar
  • Eliminar toda la carpeta bin del proyecto
  • Actualizar referencia de servicio
    • Mantener "Reutilizar tipos en ensamblados referenciados especificados"
  • Agregue referencia al ensamblaje nuevamente para corregir los errores
  • Actualizar referencia de servicio nuevamente
popiandro
fuente
0

Reiniciar Visual Studio hizo el truco para mí. Estoy usando VS 2015.

CodificaciónYoshi
fuente
-1

Tuve este problema al intentar actualizar mi referencia de servicio (aunque el error solo aparece al agregar una referencia de servicio) pero no quería eliminar la casilla de verificación de reutilización del ensamblaje.

Lo que funcionó para mí fue lo siguiente:

  • Eliminar el ensamblaje referenciado que quería reutilizar
  • Actualizar referencia de servicio
  • Mantener "Reutilizar tipos en ensamblados referenciados especificados"
  • ¡Ignora los errores, es porque falta la referencia!
  • Agregue referencia al ensamblaje nuevamente para corregir los errores
  • Actualizar referencia de servicio nuevamente

Voila, ahora se actualiza y ya no intenta eliminar todo mi código generado.

Estaba casi listo para renunciar a la función de tipos de reutilización ...

EDITAR: también asegúrese de que la configuración de compilación sea AnyCPU o x86, ya que svcutil tiene errores con x64.

Para el votante: lo siento si no funcionó para ti, ni siquiera sé por qué funcionó para mí, pero lo hizo. Es posible que haya hecho algo más esa vez que solucionó el problema, pero no hay forma de saberlo ahora.

Shahin Dohan
fuente