2009-11-09 13 views
5

Un problema con "Agregar referencia de servicio", y en realidad con SvcUtil en todas sus características. el fin de reproducir sólo tiene que añadir una OperationContract con el argumento o regresar a la clase siguiente:WCF AddServiceReference causando error de herramienta personalizada, no produciendo proxy

[XmlSchemaProvider("MySchema")] 
public class MyStructure : IXmlSerializable 
{ 
    private XmlElement e; 

    private static void Func(object o, ValidationEventArgs args) 
    { 
    } 

    public static XmlQualifiedName MySchema(XmlSchemaSet xs) 
    { 
     //xs.XmlResolver = new XmlUrlResolver();    
     XmlSchema s = XmlSchema.Read(new XmlTextReader(new StringReader("<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><xs:complexType name=\"MyStructure\"><xs:sequence><xs:any /></xs:sequence></xs:complexType></xs:schema>")), null); 

     xs.Add(s); 
     return new XmlQualifiedName("MyStructure"); 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     XmlDocument doc = new XmlDocument(); 
     e = (XmlElement)doc.ReadNode(reader); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     e.WriteTo(writer); 
    } 

    #endregion 
} 

El resultado es que cuando se utiliza addwebreference o AddSerivceReference sin una referencia a la biblioteca de clases que contiene el tipo MyStructure, todo estará bien y obtendrá una representación de xmlElement en el proxy creado automáticamente.

Sin embargo, cuando se tiene una referencia obtendrá la siguiente advertencia:

================

Advertencia advertencia de la herramienta 1 personalizado: no puede importar wsdl: portType Detalle: se produjo una excepción al ejecutar una extensión de importación WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: Tipo de referencia 'ServiceLibrary.MyStructure, ServiceLibrary, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' con el nombre del contrato de datos 'MyStructure' en el espacio de nombres '' no se puede usar porque no coincide con el DataContract importado. Es necesario excluir este tipo de los tipos a los que se hace referencia. XPath a error Fuente: // WSDL: definiciones [@ targetNamespace =' http://tempuri.org/ ']/WSDL: portType [@ name =' IService1' ] \ Projects \ WCFSample \ WCFExample \ TestAddReference \ Referencias Servicio ServiceReference1 \ \ Reference.svcmap 1 1 TestAddReference

======================

Y sin proxy se generará para usted.

Ahora, Internet está lleno de descripciones de esto cuando se tiene un DataContract genérico y/o se usa el atributo IsReference.

Este es un problema muy serio, ya que cualquier dato no tipeado causará este problema. No se pudo encontrar ninguna forma de resolver el problema. ¿Qué sucede si quiero saber el tipo del lado del cliente, compartiendo la biblioteca de clases de los contratos?

+4

Ojalá supiera la respuesta a esto. Estoy peleando un problema casi idéntico con VS2010 en este momento. En mi experiencia, WCF ha sido inestable y no confiable durante muchos años cuando se trata de generar WSDL apropiados para el consumo en svcutil.exe, y es decepcionante que aún no se haya solucionado en VS2010. ¿Nadie en Microsoft realmente usa esta tecnología? Porque no puedo configurar un servicio WCF sin toparme con este u otro problema estrechamente relacionado. –

+1

¡MICROSOFT POR FAVOR ARREGLAR ESTO! (o voy a Java) – capdragon

Respuesta

0

Este tipo de excepción generalmente significa que hay al menos una diferencia en los tipos de contratos generados por el servicio en comparación con los tipos a los que se hace referencia (¡como indica el mensaje!). Pero puede que no sea obvio a primera vista, como descubrí. Asegúrese de que todos los tipos anidados y referenciados estén actualizados con el servidor. En mi caso, los tipos anidados se actualizaron en el servidor. Pensé que había actualizado por ensamblado con referencia local (y los tipos de referencia compartidos) pero me perdí algunos. Fue necesario un examen minucioso para encontrar al culpable.

ver información adicional en this question

0

tengo una sugerencia:
tuve errores similares, incluyendo:

the .svcmap file cannot be found. It may have been moved or deleted. To generate a new .svcmap file, delete the service reference and add it again.

Y en ese punto, no hay manera de eliminar la referencia de servicio a menos que cierro VS2010 y ábrelo de nuevo.

La situación es: mi servicio WCF se está ejecutando, programé programáticamente un Description.ServiceMetadataBehavior en una dirección HTTP que defino.

En VS2010, intento agregar una referencia de servicio en la dirección HTTP, veo a mi servicio, agrego la referencia, y listo, errores y advertencia.

Problema: mi dirección HTTP contiene algunas palabras clave que a WCF no le gustan. Específicamente, la palabra COM (también se rompe con LPT).

Así que mi solución: modificar mi dirección HTTP para no tener la palabra COM. Funcionó para mí

0

Si el servicio se aloja a través de HTTPS, vaya al Administrador de IIS del servidor. En "Configuración de SSL" para el sitio, asegúrese de que "Requerir SSL" esté marcado y marque el botón de selección de Certificados de cliente para "Aceptar".

Cuestiones relacionadas