2009-11-17 9 views
7

Estoy escribiendo una aplicación .NET 3.5 y tengo control sobre el servicio WCF y el cliente.Errores/advertencias usando svcutil.exe para crear clases proxy para varios servicios WCF

Estoy usando svcutil para generar clases proxy para mis servicios, combinando varios servicios ya que comparten tipos de datos.

svcutil /out:ServiceReference.cs /noconfig /namespace:*,Global.ServiceReference 
/tcv:Version35 http://localhost:12345/first.svc http://localhost:12345/second.svc 

El problema más grave es el error - Tengo una clase que se crea dos veces, dando como resultado una gran cantidad de "ambigüedad entre 'Global.ServiceReference.MyClass.MyField' y 'Global.ServiceReference.MyClass.MyField '"errores. Tenga en cuenta que en este momento, esta clase solo se referencia en UNO de los servicios, aunque en el futuro se hará referencia a partir de más.

Los dos se miran clase generada como:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="MyClass", Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")] 
public partial class MyClass : object, System.Runtime.Serialization.IExtensibleDataObject 
{ 
    //fields 
} 

y

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")] 
public partial class MyClass 
{ 
    // same fields 
} 

Sobre la base de los atributos que se les aplica, esto tiene algo que ver con la DataContractSerializer vs XmlSerializer, pero Don Realmente entiendo lo que eso significa.

Un segundo problema es que svcutil está dando un bote lleno de advertencias de la forma:

Error: There was a validation error on a schema generated during export: 
    Source: 
    Line: 1 Column: 10415 
    Validation Error: The simpleType 'http://schemas.microsoft.com/2003/10/Serialization/:guid' has already been declared. 

Estos errores ocurren incluso con dos servicios muy simples. Por ejemplo, si el servicio # 1 tiene

[OperationContract] 
public string test(int test) 
{ 
    return "test"; 
} 

y servicio # 2 tiene

[OperationContract] 
public int Ping(string test) 
{ 
    return 23; 
} 

... consigo las advertencias. Hay como 100 de ellos, todos quejándose de varios elementos globales, atributos globales, o tipos simples como guid, duración, char, etc.

Si cambio uno de los servicios para tener solo parámetros nulos/tipo de retorno, no lo hago obtener las advertencias Esto es realmente confuso, ya que esta es la prueba más simple posible. Sin usar ningún tipo de personalización, svcutil está vomitando. ¿Alguna idea de lo que está pasando aquí?

Respuesta

1

Las advertencias son normales cuando comparte tipos y enumera varios servicios. He estado utilizando este método durante más de un año. ¿La utilidad genera la clase o no está creando nada?

+0

Sí está creando las clases. No soy consciente de que las advertencias me están perjudicando, así que estoy feliz de ignorarlas si realmente no son un problema. Es la definición de clase duplicada de la primera parte de mi pregunta que definitivamente me está matando en este momento. – Clyde

+2

Solo quiero añadir que cuando hago lo mismo con svcutil.exe, obtengo ERRORES, en realidad son advertencias, en el sentido de que el archivo de salida se genera (¡y funciona!), Pero el mensaje en la pantalla dice " Error:....!" ¡Superconfusión! – azheglov

3

Algo en los archivos XSD hace que svcutil invoque el XmlSerializer para generar algunos de sus tipos. Desafortunadamente, el intercambio de tipos entre DataContract y XmlSerializer no está disponible, por lo que terminas con tipos duplicados. Ya que parece que es probable que el uso de DC exclusivamente en el servidor, puede ser suficiente sólo para forzar svcutil permanecer en modo DC y no caer a XmlSerializer, así:

svcutil /serializer:DataContractSerializer ... 
+0

Gracias Alex! esto realmente funcionó para mí. –

Cuestiones relacionadas