WCF - Indigo
Serializzazione: WCF perchè sei tu WCF - Serialization: WCF why are you WCF

Ho passato gli utlimi 3 giorni a cercare di risolvere un problema di serializzazione di un DTO gerarchico (Customer che contiene un IEnumerable<Customer>) e non ne uscivo, il bello è che la stessa cosa l’ho fatta in decine di altri casi. Il massimo del dettaglio dell’errore che riuscivo ad ottenere era ExecutionEngineException che ovviamente non serviva a nulla. Poi con il tool Microsoft Service Trace Viewer sono riuscito a capire qualcosa in più.

Le cose da sottolineare sono:
- il DTO è gerarchico come già detto
- il DTO contiene delle property di tipo IEnumerable<T>

Detto questo, alla fine da questo errore “Object Graph for Type Xxx Contains Cycles and Cannot be Serialized if Reference Tracking is Disabled” sono riuscito ad arrivare a questo articolo: http://www.codingbliss.com/cb/?p=73

In sostanza la soluzione consiste nel markare il DTO con l’attributo DataContract (che dalla versione 3.5 SP1 di WCF non è più necessario) specificando DataContract(IsReference = true):
[DataContract(IsReference = true)]
public class Person
{
    [DataMember]
    public string Name
    { get; set; }

   [DataMember]
   public IEnumerable<Person> Children
   { get; set; }
}

E tutto si è messo a funzionare. Ora devo verificare se il problema si presenta anche con WCF 4.0. Spero di no e spero di non dover più perdere giornate a risolvere un problema (bug?) come questo :-).

Matteo Migliore.

Technorati Tags: ,,
Add Comment Filed Under [ WCF - Indigo Bug ]
[TimeTracker] Dal class-diagram al diagramma ER
Ho iniziato a lavorare ad un progetto di cui parlerò fra qualche settimana. Anticipo che si tratta di un TimeTracker, il cui scopo principale è quello di racchiudere vari principi del design object oriented e di metodologie di sviluppo del software. L'obiettivo sarebbe anche quello di creare un presentation layer che offra degli spunti concreti ed infine avere a disposizione un TimeTracker realmente utilizzabile.

Nel frattempo scriverò qualche post durante "l'avanzamento dei lavori". Ho quasi terminato il disegno del class diagram e la cosa che mi ha dato maggiormente soddisfazione al momento è il fatto di essere in grado di generare il database direttamente dal class diagram attraverso NHibernate e la corretta definizione dei file di mapping.

Per un motivo (database già esistente) o l'altro (mancanza di tempo) non ho mai sfruttato questa feature di NHibernate davvero utile.

I due vantaggi sostanziali sono:
- possibilità di generare qualunque database supportato da NHibernate
- definizione dei vincoli nei file di mapping

Anche se alla fine della fiera si tratta solamente di query T-SQL "create table" o "alter table", è stupefacente avere il database (Sql Server 2005) vuoto un momento e il momento dopo averlo completamente popolato ovviamente ottenendo gratis anche il database diagram.

Una cosa fatta meglio del diagramma ER (Management Studio) rispetto al class diagram (VIsual Studio 2008): il metodo di riorganizzazione del grafico... per il resto, beh è come sparare sulla croce rossa :-D. Il confronto tra i due modelli:
Class diagram
Class diagram TimeTracker
Diagramma ER
Diagramma ER TimeTracker

Spero di avere abbastanza tempo per poter andare avanti speditamente :-). In teoria dovrebbe anche entrarci Silverlight 1.1 in minima parte, ma è da vedere.

A breve seguiranno altre notizie.

Matteo Migliore.
[WCF] Registrare WCF in IIS
Se avete installato VS2008 prima di IIS (nel mio caso IIS7 in Vista) è necessario registrare le estensioni per WFC, che altrimenti non sono ammesse, ottenendo l'errore HTTP 405  "Method not allowed".

Per risolvere il problema è sufficiente lanciare l'utility "ServiceModelReg":
"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r

Attenzione anche alla classe a cui punta il servizio. Se si crea prima il servizio in VS e poi lo si rinomina non viene aggiornato il riferimento nel codice di markup. Per risolvere:
- tasto destro sul servizio (file .svc)
- View Markup
- controllare che l'attributo Service punti alla classe corretta

Questo è articolo spiega come ospitare servizi WCF in modalità ASP.NET compatibile.
Qui invece un semplice ma chiaro esempio di un servizio WCF.

Buoni servizi a tutti :-D.

Matteo Migliore.
Add Comment Filed Under [ WCF - Indigo ]