2009-11-17 4 views
7

Sto scrivendo un'app .NET 3.5 e ho il controllo sia del servizio WCF sia del client.Errori/Avvisi che utilizzano svcutil.exe per creare classi proxy per diversi servizi WCF

Sto usando svcutil per generare classi proxy per i miei servizi, combinando diversi servizi poiché condividono tipi di dati.

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

Il problema più grave è l'errore - Ho una classe viene creato due volte, con conseguente un sacco di "ambiguità tra 'Global.ServiceReference.MyClass.MyField' e 'Global.ServiceReference.MyClass.MyField ' " errori. Nota che in questo momento, questa classe è referenziata solo in UNO dei servizi, sebbene in futuro sarà referenziato da più.

I due generato aspetto di classe come:

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

e

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

in base agli attributi applicati a loro, questo ha qualcosa a che fare con la DataContractSerializer contro il XmlSerializer, ma io don capisco davvero cosa significano.

Un secondo problema è che svcutil sta dando una barca di avvertimenti della 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. 

questi errori accadere anche con due servizi molto semplici. Ad esempio, se il servizio # 1 ha

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

e servizio # 2 ha

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

... ottengo gli avvertimenti. C'è un centinaio di loro, tutti si lamentano di vari globalElements, globalAttributes o sempliciTipi come guid, duration, char, ecc.

Se cambio uno dei servizi per avere solo parametri void/tipo di ritorno, non lo faccio ricevi gli avvertimenti Questo è davvero confuso, poiché questo è il test più semplice possibile. Senza usare alcun tipo personalizzato, svcutil è barfing. Qualche idea su cosa sta succedendo qui?

risposta

1

Gli avvisi sono normali quando si condividono tipi e si elencano più servizi. Utilizzo questo metodo da più di un anno. L'utilità genera la classe o non crea nulla.

+0

Yep è la creazione delle classi. Non sono a conoscenza del fatto che gli avvertimenti mi fanno male, quindi sono felice di ignorarli se non sono davvero un problema. È la definizione di classe duplicata dalla prima parte della mia domanda che mi sta sicuramente uccidendo in questo momento. – Clyde

+2

Voglio solo aggiungere che quando faccio lo stesso con svcutil.exe, ottengo ERRORI - sono in realtà degli avvertimenti, nel senso che il file di output è generato (e funziona!), Ma il messaggio sullo schermo dice " Errore:....!" Superconfusing! – azheglov

3

Qualcosa nei file XSD sta causando che svcutil invoca XmlSerializer per generare alcuni tipi. Sfortunatamente la condivisione dei tipi tra DataContract e XmlSerializer non è disponibile, quindi ti ritroverai con tipi duplicati. Dal momento che sembra che probabilmente stai usando DC esclusivamente sul server, potrebbe essere appena sufficiente per costringere svcutil di rimanere in modalità DC e non cadere verso XmlSerializer, in questo modo:

svcutil /serializer:DataContractSerializer ... 
+0

Grazie Alex! questo ha funzionato davvero per me. –