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;
- Perché questo problema è apparso all'improvviso nel codice invariato e nella sorgente di framework invariata?
- 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.
Puoi pubblicare un DataContract di esempio? –
Cercherò di isolarlo ulteriormente dove si sta verificando il problema. Al momento, ha deciso di lavorare di nuovo ... :-( –
Ho aggiornato il problema con l'ultima volta che il problema si ripresenta. Ho isolato ulteriormente perché alcuni tipi vengono segnalati come errori ... –