.net - una - Referencia de servicio que no genera tipos de cliente
tipos de clientes y como tratarlos (7)
Aparentemente, debe agregar una referencia a System.Web en su proyecto antes de agregar la Referencia del servicio. Eso lo hizo.
Intento consumir un servicio WCF en una biblioteca de clases añadiéndole una referencia de servicio. En una de las bibliotecas de clase, se consume correctamente y puedo acceder a los tipos de clientes para generar un proxy fuera de ellos. Sin embargo, en mi biblioteca de segunda clase (o incluso en una aplicación de prueba de consola), cuando agrego la misma referencia de servicio, solo expone los tipos que están involucrados en las operaciones de contrato y no el tipo de cliente para que genere un proxy.
por ejemplo, Endpoint tiene 2 servicios expuestos: ISvc1 e ISvc2. Cuando agrego una referencia de servicio a este punto final en la biblioteca de primera clase, obtengo ISvc1Client yf ISvc2Client para generar proxies a fin de utilizar las operaciones expuestas a través de esos 2 contratos. Además de estos clientes, la referencia del servicio también expone los tipos involucrados en las operaciones (tipo 1, tipo 2, etc.) esto es lo que necesito. Sin embargo, cuando trato de agregar una referencia de servicio al mismo endpoing en otra aplicación de consola o biblioteca de clase, solo están expuestos Tipo 1, Tipo 2, etc., y no ISvc1Client e ISvc2Client porque no puedo generar un proxy para acceder a las operaciones que necesito. No puedo determinar por qué la referencia de servicio se genera correctamente en una biblioteca de clases pero no en la otra o en la aplicación de la consola de prueba.
En la línea de la respuesta de @ Kevin, agregué referencias a todos los proyectos y DLL a los que se hace referencia en el proyecto de servicio. La generación del proxy fue capaz de reconocer / generar los tipos requeridos.
Una vez hecho esto, incluso podría comenzar a eliminar algunos y regenerar para excluir los redundantes.
Esto normalmente ocurre al agregar una referencia de servicio que había agregado anteriormente. En la configuración del cliente, todavía tiene el modelo de servicio relevante. ¡Asegúrese de eliminar el modelo de servicio de la configuración del cliente y luego intente volver a agregar la referencia de servicio!
La verdadera respuesta es que si está serializando un tipo utilizando KnownTypeAttribute en su contrato de servicio, DEBE incluir una referencia a la biblioteca de su tipo en el proyecto al que está agregando la referencia de servicio.
Por ejemplo, si su servicio wcf serializa el tipo System.Drawing.Image, entonces el proyecto del consumidor DEBE tener una referencia a System.Drawing. Espero que esto ayude a algunas personas por ahí.
Me encontré con el mismo problema. Resulta que mi proyecto estaba haciendo referencia a una DLL directamente en lugar de una referencia de proyecto. Entonces, aunque mi proyecto tenía una referencia para el ensamblaje, era una versión anterior. Una vez que actualicé la DLL y actualicé la referencia de servicio, todo estaba funcionando nuevamente.
Me enfrenté a un problema similar, esto se debe a un error de tipo. Debido a lo cual no pude generar el cliente en el proyecto de prueba. Mantenemos diferentes versiones de contratos, mientras creamos una nueva versión introduje el error de desajuste de tipo. Lo siguiente fue el escenario de código en mi caso.
Contrato de la versión 1
[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange
}
Contrato de la versión 2
[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange,
[EnumMember]
Mango
}
Resolví este problema usando la utilidad de línea de comandos svcutil . Mando
svcutil MyContract.dll
Recibí el siguiente mensaje de error
DataContract for type ''V2.Fruits'' cannot be added to DataContractSet since type ''V1.Fruits with the same data contract name ''Fruits'' in namespace ''http://www.exmample.com/v1'' is already present and the contracts are not equivalent.
Cambié el espacio de nombres de la versión 1 a la versión 2 y pude generar una referencia de servicio en el proyecto de prueba.
[DataContract(Namespace="http://www.exmample.com/v2")]
public enum Fruits
{
[EnumMember]
Apple,
[EnumMember]
Orange,
[EnumMember]
Mango
}
Hacer uso de svcutil esto ayudará a resolver este problema.
Puede haber seleccionado Reuse types in specified reference assemblies
pero no se ha elegido la muy importante biblioteca mscorlib
.
Primero haga clic en ''Mostrar todos los archivos'' en la parte superior de su Solution Explorer para que pueda expandir la referencia del servicio.
- Busque el archivo
Reference.cs
y ábralo. - Busque
ClientBase
en el código fuente para asegurarse de que realmente no haya generado un cliente con un nombre que no esperaba. Si lo encuentras, ese es el nombre de tu cliente de servicio.
Si nada coincide, haga clic con el botón derecho en la referencia del servicio y seleccione Configure Service Reference
.
El más importante es mscorlib
que se requiere para generar correctamente el cliente. Me gusta seleccionar System.Xml.Linq
también para obtener buenas clases de Linq como XElement
y no XmlElement
.
¿Todavía estancado?
Consejo: siempre prefiero crear una DLL dedicada solo para la referencia del servicio. Puede ser útil si necesita eliminarlo y comenzar de nuevo, y evita ciertos problemas de compilación de huevos y gallinas de vez en cuando.
Si termina con la mitad de un archivo References.cs, puede estar ''reutilizando un tipo de referencia'' que no es compatible con su contrato de datos. es decir, ha agregado miembros de datos en el lado del servidor o ha cambiado la firma de un miembro existente, como hacer que un tipo de valor sea opcional.
En primer lugar, tenga en cuenta que SVCUTIL generará muy felizmente un archivo de salida incompleto, incluso si tiene problemas, y cuando se ejecuta desde Visual Studio no obtiene el archivo de registro. Mantenga un ojo en Explorer para el tamaño esperado y compárelo con el tamaño de su "último bien conocido".
Intente ejecutar SVCUTIL.EXE directamente desde un archivo por lotes (recuerde guardar este archivo para la próxima vez)
Esto es más fácil de hacer en un símbolo del sistema de Visual Studio
El comando de ejemplo es el siguiente, tenga en cuenta el parámetro de
reference
para la DLL a la que hace referencia.svcutil.exe http://dev.example.com/SSWPF.Web/Services/SS.svc /reference:bin/debug/RRStore.Sys.DLL
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: Tipo de referencia ''SS.Sys.ShippingRateInfo, RRStore.Sys, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'' con el nombre del contrato de datos ''ShippingRateInfo'' en el espacio de nombres '' http://schemas.datacontract.org/2004/07/SS.Sys no se puede usar porque no coincide con DataContract importado. Es necesario excluir este tipo de los tipos a los que se hace referencia. XPath to Error Fuente: // wsdl: definitions [@ targetNamespace = '' http://tempuri.org/ ''] / wsdl: portType [@ name = ''ISSWCF'']
Afortunadamente la respuesta aquí fue simple, mi tipo ShippingRateInfo
había cambiado y no lo había actualizado. Una vez que copié este tipo desde el servidor, todo compiló muy bien (elegí volver a la herramienta VS).