¿Qué significa este error de WCF? "Advertencia de herramienta personalizada: no se puede importar wsdl: portType"

84

Creé un proyecto de biblioteca de servicios WCF en mi solución y tengo referencias de servicio a esto. Utilizo los servicios de una biblioteca de clases, por lo que tengo referencias de mi proyecto de aplicación WPF además de la biblioteca de clases. Los servicios se configuran directamente, solo se modifican para obtener funciones de servicio asíncronas.

Todo funcionaba bien, hasta que quise actualizar mis referencias de servicio. Falló, así que finalmente retrocedí y volví a intentarlo, ¡pero falló incluso entonces! Entonces, la actualización de las referencias del servicio falla sin realizar ningún cambio. ¡¿Por qué?!

El error que obtengo es este:

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

La advertencia brinda más información:

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

También hay dos advertencias similares que dicen:

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

Y lo mismo para:

Custom tool warning: Cannot import wsdl:port .. 

Encuentro todo esto confuso ... No tengo una clase Paciente en el Panel del lado del cliente, excepto la que obtuve a través de la referencia de servicio. Así que, ¿qué significa? ¿Y por qué aparece de repente? Recuerda: ¡ni siquiera cambié nada!

Ahora, la solución a esto se encontró aquí , pero sin una explicación de lo que esto significa. Entonces; en "Configurar referencia de servicio" para el servicio desmarco la casilla de verificación "Reutilizar tipos en los ensamblajes referenciados". Reconstruir ahora todo funciona bien sin problemas. ¿Pero qué cambié realmente? ¿Esto tendrá un impacto en mi solicitud? ¿Y cuándo se debe desmarcar esto? Quiero reutilizar los tipos en los que configuré DataContract, pero no más. ¿Seguiré teniendo acceso a los que no lo hayan marcado?

stiank81
fuente
Bien, hay una breve explicación sobre msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Pero, ¿alguien tiene una mejor explicación? ¿Cómo se refiere esto a los contratos de datos que configuro?
stiank81

Respuestas:

37

Cuando agrega una referencia de servicio, hay dos formas de manejar los tipos que usa el servicio:

  • Los tipos se almacenan en una dll y se hace referencia a esa dll tanto desde el cliente como desde la aplicación del servidor.
  • Los tipos no están en una dll referenciada por el cliente. En ese caso, la herramienta que crea la referencia de servicio creará los tipos en el archivo reference.cs.

Hay muchas cosas que pueden salir mal. Hemos descubierto que si la herramienta falla, a veces es más rápido eliminar la referencia del servicio y comenzar de nuevo.

Hemos dejado de usar la referencia de servicio. Para proyectos donde tenemos el control del cliente y el servicio, usamos el método descrito en este screencast .

Shiraz Bhaiji
fuente
2
¡Gracias! De hecho, encontré ese screencast ayer. ¡Lo vi, y realmente fue una revelación! Estoy planeando mudarme a esa estructura una vez que tenga lo básico en su lugar. Parece que ha estado luchando con algunos de los mismos problemas que estoy viendo. Con demasiada frecuencia termino borrando y leyendo las referencias de servicio cuando algo extrañamente sale mal, y eso no es una buena señal. ¡Espero que la arquitectura descrita ayude!
stiank81
¿Alguien ha podido escribir el servicio web a mano cuando está utilizando un enlace PollingDuplex con Silverlight 5?
Richard B
157

Encontré mi respuesta aquí: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

En pocas palabras: desmarqué Reutilizar tipos en ensamblajes de referencia en el menú Avanzado .


No sé si esto importa, pero no estoy usando MVC, sino Web Forms.

Dragos Durlut
fuente
2
También se requiere un reinicio de VS 2012
George Filippakos
Interesado en verlo, pero el enlace ya no está disponible, por favor compártelo si lo tienes en otro lugar
Chris
1
Funciona en un proyecto MVC 3 bajo VS2013 (no es necesario reiniciar).
Pawel Krakowiak
5
+1 - Solo como referencia: para realizar este cambio, haga clic con el botón derecho en la referencia de servicio en el proyecto que lo consume y seleccione 'Configurar referencia de servicio ...'
GrandMasterFlush
2
Nada es mejor que "la historia corta" :)
Ron
9

También tuve este problema hoy. Me tomó un día entero encontrar mi error. Espero eso ayude.

Mi clase que no se pudo importar tiene una propiedad de tipo cutom enum. Esta propiedad está marcada como DataMember y la enumeración también está marcada como DataContract. Todo bien hasta ahora. Simplemente olvidé marcar cada miembro de enumeración como EnumMember.

Así que cambié

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

A esto:

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

¡Y finalmente funcionó!

Aurel
fuente
8

Vaya a Propiedades avanzadas mientras agrega la referencia y elimine "System.Window.Browser" de la lista de verificación. Resuelve el problema.

Sridhar Subramanian
fuente
¡Gracias! Ya no se usan las referencias de servicio: se hace el enfoque manual descrito en el screencast de la respuesta de @Shiraz. ¡Pero es bueno saberlo de todos modos!
stiank81
8

Eso puede sonar extraño, pero lo solucioné eliminando las referencias, luego cerrando Visual Studio, volviéndolo a abrir y finalmente agregando las referencias nuevamente.

Creo que era necesario reiniciar la herramienta personalizada o algo así.

Ateik
fuente
2
incluso si está decidido a resolver el problema SIN eliminar la referencia, le recomiendo que cree un NUEVO PROYECTO y agregue la referencia para ver si funciona. esto puede revelar un error que no ve en su proyecto existente o puede simplemente funcionar
Simon_Weaver
4

Constantemente me encuentro con este error mientras funciona en otra máquina de desarrolladores. Aunque soy un administrador completo en todas partes de mi máquina virtual, intenté cerrar Visual Studio y volver a abrirlo con 'Ejecutar como administrador' y funcionó mágicamente.

Buena suerte.

Tim Gabrhel
fuente
2

Recibí la advertencia después de actualizar mi solución de Visual Studio (VS) 2010 a 2013 y cambiar el .NET Framework de cada proyecto de 4 a 4.5.1. Cerré VS y volví a abrir y las advertencias desaparecieron.

Paul Berglund
fuente
Esto me ayudó, pero cambié de .NET 4.5.2 a 4.6 Gaa.
Jimenemex
1

Una desventaja de desactivar "tipos de reutilización en ensamblajes referenciados" es que puede causar problemas con referencias ambiguas. Esto se debe a que la referencia del servicio crea esos objetos nuevamente en el archivo .cs de referencia, y su código que implementa el servicio puede hacer referencia a ellos desde el espacio de nombres original.

Cuando ocurre este escenario, encuentro útil verificar los 'tipos de reutilización en ensamblajes referenciados especificados', lo que me permite elegir los que solo tienen referencias ambiguas, lo que resuelve el problema rápidamente de esa manera.

Espero que ayude a alguien más.

Juan
fuente
0

Mis interfaces del servicio WCF están en un ensamblado, la implementación está en otro y la referencia del servicio está en otro ensamblado, separado de los clientes de la referencia del servicio. Recibí el mensaje de error justo después de aplicar el DataContract a una enumeración. Después de aplicar EnumMember a los campos de la enumeración, el problema se resolvió.

zsolt világos
fuente
0

Si tiene dudas de que su servicio no tiene ningún problema (como problemas con enumeraciones o clases no serializables mencionadas por otros), intente crear un nuevo proyecto con una nueva referencia.

Estoy usando Silverlight 5 y había intentado eliminar y volver a crear la referencia varias veces. El reference.csarchivo aparecía completamente vacío cada vez y habían pasado literalmente años desde que lo había creado, por lo que tratar de averiguar qué había cambiado en el servicio estaba fuera de discusión.

Noté que el error contenía referencias a 2.0.5.0. Ahora ni siquiera sé si esto es realmente relevante para la versión de Silverlight, pero me hizo pensar en crear un nuevo proyecto y de repente todo funcionó.

Advertencia 2 Advertencia de herramienta personalizada: No se puede importar wsdl: portType Detalle: se lanzó una excepción al ejecutar una extensión de importación WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: No se pudo cargar el archivo o ensamblado 'System.Xml, Versión = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e 'o una de sus dependencias. El sistema no puede encontrar el archivo especificado. XPath al origen del error: // wsdl: definiciones [@targetNamespace = ''] / wsdl: tipo de puerto [@ name = 'IShoppingCart']

Simon_Weaver
fuente
0

Estaba revisando mi proyecto y estaba teniendo el mismo problema. Resultó ser versiones diferentes de la misma DLL en WCF frente al sitio web. El sitio web tenía una versión más reciente de la DLL y el servicio hacía referencia a una versión anterior de la DLL. Una vez que estuvieron todos sincronizados, todo funcionó bien.

CBBSpike
fuente
0

Experimenté el mismo error. Luché durante casi un día tratando de averiguar qué estaba pasando. La pista para mí fueron las advertencias que estaba lanzando VS. Estaba tratando de hacer algún tipo de mapeo en Yahoo.Yui.Compressor.dll, una biblioteca que había agregado y eliminado (porque decidí no usarla) un par de días antes. Fue impactante porque la biblioteca no estaba allí, pero de alguna manera estaba tratando de hacer referencia a ella.

Finalmente, restauro este dll de la Papelera y luego pude actualizar mi referencia de servicio con éxito.

cdiaz
fuente
0

Para cualquiera que esté aquí en el futuro, tuve el mismo error pero causado por problemas de versión, de dos maneras diferentes.

Tengo dos servicios WCF y dos aplicaciones cliente que se comunican a través de las referencias de servicio. Actualicé un paquete nuget en ambos lados e intenté actualizar la referencia del servicio y obtuve este error.

Eliminar no ayudó. No se desea desmarcar "reutilizar ensamblajes", ya que necesito reutilizarlos, ese es el punto.

Al final, hubo dos problemas separados:

1) El primer problema, creo, fue un problema de almacenamiento en caché de Visual Studio. Revisé meticulosamente todas las referencias y no encontré problemas, pero aún así informó que no podía encontrar la versión anterior del archivo. Desinstalé todos los paquetes nuget, reinicié Visual Studio y los reinstalé. La actualización de la referencia del servicio funcionó.

2) El segundo problema fue causado por un problema de dependencia. Actualicé el paquete nuget en ambos lados y todo parecía correcto, pero una dependencia no marcada no estaba sincronizada. Ejemplo:

El paquete Foo v1 hace referencia a la barra v1. Es posible actualizar Foo y Bar a v2 de forma independiente sin actualizar la referencia. Si instala Foo y Bar v2, la herramienta de referencia del servicio escaneará Foo v2, verá la referencia a Bar v1 y fallará porque no puede encontrar la versión anterior. Esto solo se informa correctamente si actualiza los números de versión de su dll para cada paquete. Visual Studio y MSBuild no tendrán problemas para construir la aplicación, pero la referencia del servicio lo pasará fatal tratando de resolver todo.

Espero que esto ayude a alguien.

TheMightyGherkin
fuente