2012-12-16 11 views
11

Ho iniziato a riscontrare errori nella deserializzazione di WCF oggi - in codice che è rimasto invariato e funziona da mesi.XmlException nella deserializzazione WCF: "Il nome non può iniziare con '<'" - nei campi di backup automatico delle proprietà

Il problema è che sto ricevendo il runtime XmlException s dicendo "Il nome non può iniziare con il '<' carattere '. Ho eseguito il debug nel sorgente .NET e sembra che l'errore stia deserializzando gli oggetti restituiti dalle chiamate di servizio WCF. Questi oggetti sono definiti utilizzando proprietà automatiche e sembra che i campi di supporto abbiano nomi come <MyProperty>k_BackingField, da cui proviene XmlException.

Ho visto un paio di altri riferimenti online in cui la gente accetta la soluzione "Ho cambiato il mio codice per non utilizzare le proprietà automatiche", il che non è realmente accettabile per me, poiché avrei 100 di oggetti da modificare , (con migliaia di proprietà tra di loro). Inoltre, lo stesso codice funzionava bene quando l'ho eseguito la settimana scorsa, e non sembra influenzare tutti i DTO serializzati, solo alcuni.

Per renderlo ancora più frustrante, sembra leggermente intermittente. In questa occasione, stamattina, non è stata fatta eccezione ...!

Domande;

  1. Perché questo problema è apparso all'improvviso nel codice invariato e nella sorgente di framework invariata?
  2. Come posso risolvere questo problema senza modificare tutti i DTO per utilizzare le proprietà completamente implementate?

UPDATE: Dopo un giorno o due di lavorare bene, questo problema è ricomparso - alcun motivo posso trovare il motivo per cui dovrebbe funzionare/non funziona/lavoro di nuovo, ma qui ci sono.

Ho rintracciato il problema ulteriormente per essere correlato a qualche codice che ho sui miei ServiceContracts utilizzando l'attributo ServiceKnownType, che viene utilizzato per definire i tipi noti per la serializzazione. Sembra che, sebbene i tipi segnalati con errori non siano nemmeno parte della chiamata al servizio che sto facendo in quel momento, questo errore si verifica sui tipi che fanno parte del comportamento di pubblicazione di questi tipi noti.

Il problema si verifica quando utilizzo del codice di creazione proxy per applicare alcuni comportamenti del servizio;

IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
    description, this.preserveReferences, this.maxItemsInObjectGraph); 
innerBehavior.ApplyClientBehavior(description, proxy); 

non posso eseguire il debug del codice di ApplyClientBehavior in quanto è parte di System.ServiceModel (o posso?), Ma qualcosa in quel metodo sta cercando di convalidare tutti i tipi che ho pubblicato con il mio attributo ServiceKnownType, e la rottura su alcuni dei loro con questo XmlException. Non ho IDEA perché alcuni tipi stanno fallendo - e solo per alcune delle loro proprietà.

Questo è un esempio dei tipi che ricevono gli errori segnalati;

[Serializable] 
public class MyDataObject 
{ 
    public ActivitySession(string id) 
    { 
     this.Id = id; 
     this.IsOpen = true; 
    } 

    public string Id { get; set; } 

    public bool IsValid { get; set; } 
} 

L'eccezione ha segnalato un errore contro Id -><Id>k_BackingField cannot start with '<'

Quindi niente controverso in quella classe, e nessuna eredità di prendere in considerazione. Non fa nemmeno parte di un contratto di servizio, solo che in precedenza era stato pubblicato come tipo noto per la serializzazione.

Questo sta diventando piuttosto esoterico ora, quindi non mi aspetto una risposta, ma sto semplicemente aggiornando dove si trova il problema.

+0

Puoi pubblicare un DataContract di esempio? –

+0

Cercherò di isolarlo ulteriormente dove si sta verificando il problema. Al momento, ha deciso di lavorare di nuovo ... :-( –

+0

Ho aggiornato il problema con l'ultima volta che il problema si ripresenta. Ho isolato ulteriormente perché alcuni tipi vengono segnalati come errori ... –

risposta

9

Penso di aver trovato più informazioni per aiutare a spiegare questo problema, (almeno per quanto riguarda il motivo per cui l'errore viene visualizzato solo su alcuni tipi).

I DTO che ottengono segnalazioni di eccezioni contro di loro sono;

  • pubblicato come parte del mio [ServiceKnownType] attributo
  • contrassegnati con [Serializable]
  • NON contrassegnati con [DataContract]

Aggiungendo l'attributo [DataContract] al tipo risolve questo problema. Non ho idea del perché, e ancora non ho idea del motivo per cui questo errore è intermittente in quando si verifica, ma coerente in ciò che influenza.

+0

Se dovesse capitare di aiutare qualcun altro, questa è la soluzione migliore che ho trovato, anche se non ho ancora spiegazioni, quindi sono felice di accettare una risposta migliore. –

+0

Apprezzo davvero questo suggerimento, mi ha salvato _un sacco_ di tempo proprio ora.Il mio DTO era ** mai ** contrassegnato con l'attributo '[DataContract]' e ha funzionato bene per mesi.Un giorno ho dovuto riavviarlo e mi ha colpito con questo problema del nulla, aggiungendo l'attributo re risolto immediatamente. – chrnola

+1

Questo mi ha aiutato enormemente. Nel mio caso, una delle mie classi base non è stata decorata con l'attributo [DataContract]. –

0

Ora ho una soluzione alternativa, tuttavia non è una cosa su cui posso contare -> i DTO che causano il problema sono stati rimossi dal produttore [ServiceKnownType], che fa scomparire l'errore.

Mi chiedo se il problema riguardi i nomi dei membri su cui sto ottenendo eccezioni. Finora ho visto lamentarsi;

  • Id
  • Address
  • UserName

Sarebbe ragionevole aspettarsi quei nomi particolari proprietà sono in uso da qualche altra parte nel modello di serializzazione o del servizio, causando loro di essere compilati in modo diverso, Suppongo.

+1

Risulta forse non - provato a rinominare alcuni di questi campi e ottenere lo stesso problema con 'MyId', 'BogusAddress', 'UserNameX'. Il problema è certamente correlato ai tipi però - non mi piace * alcuni * nomi in * alcuni * tipi indipendentemente da quali sono i nomi ....! –