March 2007 - Posts
Articolo da me pubblicato su week.it del 13/2/2007. Riporto as is:
I workflow di Windows Workflow Foundation sono eseguiti dal Workflow Runtime all’interno del processo che li ospita. Per eseguire un workflow è necessario crearne una istanza da far girare all’interno del runtime.
Lo sviluppatore dovrà inizializzare la classe WorkflowRuntime, avviarla e terminarla: la classe espone i metodi StartRuntime e StopRuntime a questo scopo.
Ogni istanza del motore di runtime gira in-process rispetto al processo che la ospita: è possibile ospitare più runtime all’interno dello stesso Application Domain .Net e ogni runtime engine può gestire più istanze (cioè più workflow in esecuzione).
Dietro le quinte, per default, viene usato il servizio DefaultSchedulerService che lavora in asincrono fornendo una coda che accoglie le istanze da eseguire: in pratica quando si avvia una istanza di workflow, questa viene accodata nello scheduler; quest’ultimo recupera un thread dal thread pool dell’host che ospita il runtime ed esegue il workflow.
È possibile configurare, tramite la proprietà MaxSimultaneousWorkflow (ma ci sono delle controindicazioni nel modificare il valore di default, 5, nel caso di macchine monoprocessore) il numero massimo di thread utilizzabili dallo scheduler, che corrisponde al numero di istanze di workflow che possono girare contemporaneamente.
Le richieste accodate vengono processate nel momento in cui si rende disponibile un thread. Utilizzando lo scheduler di default il thread che avvia il workflow viene liberato immediatamente ed eventuali eventi del workflow stesso vengono ricevuti su un thread secondario.<
Ricordo che è necessaria una operazione di Invoke/BeginInvoke per poter aggiornare i controlli dell’interfaccia utente Windows Forms o Windows Presentation Foundation da un thread secondario.
È possibile modificare questo comportamento usando, al posto del DefaultSchedulerService, il servizio ManualWorkflowSchedulerService: tramite questo scheduler il workflow gira in sincrono con il thread che lo esegue; lo sviluppatore dovrà avviare manualmente il workflow tramite RunWorkflow.
In pratica il thread che avvia l’esecuzione del workflow viene usato per far girare il workflow. Lo scheduler manuale consente anche ad una applicazione Asp.Net di mantenere un numero di thread identico fra istanze di workflow in esecuzione e thread usati dal motore di Asp.Net per esaudire le richieste correnti sui workflow.
In generale è bene far girare i workflow in asincrono per ovvi motivi (la modalità di default) e ricorrere allo scheduler manuale solo nei casi in cui la strada del flusso asincrono non è percorribile e vi garantisco che sono molti meno di quanto si possa pensare.
Altre info utili
- Rientranza dei thread con Windows Workflow Foundation
http://blogs.devleap.com/paolo/archive/2007/02/06/rientranza-delle-chiamate-in-wf.aspx
- Ancora su Thread e Thread Pool per WF
http://blogs.devleap.com/rob/archive/2007/02/07/windows-workflow-foundation-thread-pool.aspx
- Tecniche di programmazione asincrone in ASP.NET
http://blogs.devleap.com/articolidevleap/archive/2007/02/07/asp-net-2-0-async-techniques.aspx
- Un approfondimento su Windows Workflow Foundation e le altre componenti di .Net 3.0 è previsto alla DevLeap Conference 2007 http://devcon.devleap.com
Ieri sono capitato in un centro commerciale e dopo che Alessandro Perilli a dicembre me ne aveva decantato le "bellezze" ho portato a casa una scatola con sopra scritto Wii.
Come da previsione di Alessandro, la mia ragazza è letteralmente impazzita e fino alle 4 di notte cercavamo di battere il computer ad un doppio di tennis.
Sicuramente la console non è paragonabile a Xbox 360 dal punto di vista grafico (Wii fa solo 480p) e audio (Wii non è 5+1), ma l'idea è fenomenale, credo soprattutto per noi, non più ragazzini, che giocano ogni tanto e non hanno voglia di imparare 420 combinazioni di tasti per eseguire una mossa.
Adesso, alle cene con amici dovremmo prendere decisioni storiche: grafica, audio e giochi quasi reali tipo Gears of War, Tomb Raider etc su XBox 360 comodamente seduti e concentrati oppure omini buffi e panciuti, esercizio fisico e un incontro di Box o Tennis :-)
Ho aggiornato le schede tecniche dei nostri corsi su ASP.NET 2.0 che da gennaio includono (sempre in base alle esigenze del cliente) ASP.NET AJAX e l'interazione con IIS7 (per Vista e in previsione di Longhorn Server)
In tutti i corsi su ASP.NET 2.0 si possono trattare i seguenti argomenti:
ASP.NET AJAX
- Obiettivi
- Architettura Client
- Architettura Server
- AJAX Library senza ASP.NET
- Namespace
- Contenuto della confezione
- ASP.NET AJAX Extensions
- Web.config
- Partial Page Rendering
- UpdatePanel
- UpdateProgress
- Timer
- ScriptManager
- Inside Partial Page Rendering
- Conditions
- Master Page e User Control
- Page Request Manager
- Animations
- Postback priority
- Error Handling
- Inside Script Manager
- Inside Timer Control
- Asyncronous Communication Layer
- JSON Notation
- Architettura
- WebRequest
- WebRequestManager
- XmlHttpExecutor
- XmlHttp
- Web Service Proxy
- Page Method Proxy
- Profile Proxy
- Auth Service Proxy
- Handling Errors
- Complex Object
- Debugging Challenge
- Server-side
- Client-side
- Sys.Debug methods
- Debugging client e server code
- AJAX e Javascript
- Type System
- OOP in Javascript
- Script as component
- Dynamic Script
- Extending AJAX
- Sys.Component
- Sys.UI.Control
- IScriptControl
- Behavior e Extender Control
- Change Notification
- AJAX Control Toolkit
- Localization e Globalization
IIS7 e ASP.NET
- "The Wedding"
- Architettura
- Core Web Server Modules
- Deployment
- Configuration
- Security with ASP.NET
- Diagnostic
- Application Pool Model
- ASP.NET Modules & Handler
- <system.weServer>
- Pipeline
- Migrating Code
- FREB
- Tracing Integration
- Activation and WCF
- Monitoring
- Error Detail
- RSCA
- Extensibility
- Custom UI Module
- Custom Admin Page
- Security
- IUSR_machine is dead
- IIS_IUSRS
- Impersonation
- Url Authorization
- Request Filtering
- Provisioning
Le schede tecniche relative (nel corso Intro gli argomenti sono ovviamente trattati ad un livello di dettaglio inferiore) sono:
2)
ASP.NET 2.0 Core: Argomenti avanzati come WebEvent, Custom Provider, Custom Events, Custom Handler e Custom Module, Asyncrounous Page, MSMQ, System.Transaction, SQL 2005 Broker.
In questi giorni sono veramente incasinato: un progetto software in partenza, DevCon 2007, la nostra conferenza annuale e la formazione personale. Questo per dire che negli ultimi giorni sono stato un po' assente dal blog. Trovo stasera il tempo di rimettere insieme qualche informazione e screenshot di Orcas CTP di Marzo che uso da qualche giorno. Purtroppo ho cancellato la vecchia macchina virtuale con la January CTP che aveva alcun funzionalità non presenti (perchè non allineate come versione) in quest'ultima CTP: soprattutto in ambiente mobile non abbiamo un versione di .NET CF 3.5 allineata a questa versione di Visual Studio 9.
Le informazioni sono in ordine sparso in base a quanto ho affrontato in questi giorni.
N.B. Le immagini sono leggermente tagliate a destra, ma il loro contenuto è importante solo per la parte visibile.
Team System Application Diagram e Service
Il WebServiceEndpoint è diventato .NETWebServiceEndpoint. A discapito del nome e all'integrazione di alcuni strumenti della versione 9 rispetto a WCF, non consente di creare Endpoint verso servizi WCF. Un collegamento come il seguente crea sempre una Web Reference classica nel progetto consumer del servizio:

In questo caso infatti il client Windows si ritrova una directory Web Reference con all'interno la classica Web Reference con tanto di reference.cs.
Questo accade anche se nei progetti (visualizzandoli nella solution di VS) non esiste più il comando Add Web Reference. Ha preso il suo posto Add Service Reference che consente di creare appunto una reference verso servizi WCF e verso i classici .asmx di .NET 2.0. Il namespace per default è ServiceReference così come il folder nel progetto.
Anche nel caso di "aggancio" con ASMX, lato cliente viene usato WCF tramite un basicHttpBinding o un customBinding.
Il menù Configure Service Reference che dovrebbe essere una sorta di UI helper per la gestione del .config del consumer non è ancora stato implementato in questa CTP.
Refactoring di servizi WCF
Facendo qualche prova capita frequentemente di dover eseguire operazioni di Refactoring: occhio che se fare refactoring dell'interfaccia di un servizio WCF e della classe, la configurazione ABC nel config non viene aggiornata.
Compilazione
Per default il primo progetto creato con Visual Studio 9.0 è ancora legato al runtime .NET versione 2.x. Per legare il progetto al runtime .NET 3.5 si può inserire nel .config (web.config o app.confg) la seguente configurazione del compilatori:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" compilerOptions="/optioninfer+">
<providerOption name="CompilerVersion" value="v3.5"/>
</compiler>
</compilers>
</system.codedom>
Unit Test
Dal menù di creazione di uno Unit Test su un metodo è possibile creare un nuovo test su un assembly al posto del classico codice sorgente. Valgono le regole attuali per i membri private accessibili tramite il PrivateAccessor autogenerabile.
Test List diventa Test List Editor e consente, come adesso, di organizzare i test in raggruppamenti per una più semplice identificazione e esecuzione a comando o su una Build.
E' possible eseguire Unit Test su progetti mobile (Smart Device Project). Nell'immagine seguente mostro la directory dei tool per il device e le relative dll.

La creazione di uno Unit Test (con Add Assembly citato prima) è la seguente:

Il progetto mobile risultante è un Device Project a tutti gli effetti (che potrebbe essere anche fatto girare sul desktop come tutti i progetti mobile con qualche workaround...a tal proposito si vedano i miei post sul sito http://thinkmobile.it). Il framework di esecuzione del test è referenziato (ovviamente) nel progetto test:

Il frameowrk di test per smart device è un subset degli strumenti disponibili nell'edizione Tester di VSTS. Queste le funzionalità non supportate:
- Web tests and the Microsoft.VisualStudio.TestTools.WebTesting API
- Generic tests
- Load tests and the Microsoft.VisualStudio.TestTools.LoadTesting API
- ASP.NET unit tests and Microsoft.VisualStudio.TestTools.UnitTesting.Web API
- C++ test projects
- C++ unit tests
- Data driven unit tests
- Obtaining code coverage data in unit tests
- Creating a performance session
- Web services unit tests
- Working with controllers, agents, and rigs
- The following Team System testing tools are implemented differently for smart devices:
- Smart device specific C# and Visual Basic test projects
- A version of the Test Host adapter that runs on the device
- Extra Test Run Configuration settings for smart devices
- Must attach manually to debug smart device unit tests. For information about manually attaching to process, see How to: Debug while Running a Test in an ASP.NET Solution
- Different method of Test Deployment
- Device specific port of the Microsoft.VisualStudio.TestTools.UnitTesting API with the following classes removed:
- DataSourceElement
- DataSourceElementCollection
- TestConfiguration
- TestConfigurationSection
- WebServiceHelper
Performance Session
Nelle proprietà di una Performance Session è possibile indicare i counter del Performance Monitor da collezionare durante la fase di analisi: questo consente di effettuare analisi più accurate da un unico strumento di analisi. Si può anche decidere di eseguire una Performance Session senza collezionare i dati semplicemente agendo dal menù contestuale (senza dover entrare nelle proprietà)
Durante una sessione di performance si può attivare il Runtime Control che consente di definire vari "mark" per effettuare analisi su porzioni della sessione. I vari mark vengono poi riepilogati nel report al termine della sessione.
E' stata modificata l'interfaccia per l'analisi dei .vps (Performance Session Data) per consentire l'impostazione di query sui dati, filtri sui vari elementi da analizzare: è possibile ad esempio visualizzare solo i dati di una certa function oppure con un certo valore. Il tutto si effettua dall'interfaccia di visualizzazione seguente:

Le query create e i dati relativi possono essere salvati in un file .vsps ed è possibile salvare e ricaricare la definizione delle query tramite file .vspf.
L'analisi dei dati comprende anche ETW, Marks e i processi entrati in causa.
Un nuovo strumenti di analisi consente di visualizzare i "Code Metrics" per capire se il codice di un progetto/solution è complesso da manutenere, il livello di coupling, la profondità gerarchica delle classi e l'ormai famoso indice di Cyclomatic Complexity (già presente nel Code Analysis della versione attuale in forma testuale). Ecco il nuovo strumento su un mio progetto di Test:

ASP.NET
Un nuovo progetto ASP.NET usa i compilatori della versione 3.5: nel web config infatti otteniamo da subito:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" compilerOptions="/optioninfer+">
<providerOption name="CompilerVersion" value="v3.5"/>
</compiler>
</compilers>
</system.codedom>
L'editor delle pagine e in generale dei sorgenti web fornisce Intellisense su Javascript e sulle AJAX. Ecco un esempio su Javascript

Le AJAX Extension comunque vanno installate.
Ho un solo grosso problema: sabato cerco di capire...il designer dei Workflow che dovrebbe avere le nuove dialog per le Rule non si apre :-(
Per il resto, giusto come considerazione, ho montato tutto su una macchina virtuale assegnando 1.360 MB di RAM...e devo dire che viaggia benone, considerando che purtroppo la macchina virtuale è su un disco esterno che non è veloce quanto il mio disco interno. In una settimana, un solo crash dell'ambiente senza perdere niente. Ottimo direi.
Per la parte mobile, purtroppo il .NET CF 3.5 che era presente nella CTP di Gennaio non c'è più. Sabato, dopo la creazione di uno snapshot :-) spero di avere il tempo di provare a montare la parte mobile della CTP di gennaio sopra la CTP di Marzo...speriamo bene :-)
Rilasciato ieri il nuovo Service Pack per il .NET CF versione 2.0.
Per adesso è in versione redistributable; solitamente dopo qualche giorno esce anche la versione Developer che aggancia la nuova versione a VS 2005.
Il download a partire da http://www.microsoft.com/downloads/details.aspx?FamilyID=aea55f2f-07b5-4a8c-8a44-b4e1b196d5c0&displaylang=en.
E' uscito un aggiornamento per i Books Online di SQLCE 3.1.
Da una prima occhiata sembra solamente che non ci siano aggiunte alla documentazione: sono stati corretti tutti i riferimenti a SQL Everywhere che era il nome in codice del prodotto durante lo sviluppo interno.
Una ulteriore stranezza è però il nome attuale "SQL Server 2005 Compact Edition Books Online". Il prodtto aveva infatti perso la "clausola" Server 2005, ma ormai siamo abituati in ambiente mobile ad avere 5/6 nomi per ogni prodotto :-)
Il download da quì : http://www.microsoft.com/downloads/details.aspx?familyid=E6BC81E8-175B-46EA-86A0-C9DACAA84C85&mg_id=10111&displaylang=en
Stavolta è uscito per davvero. Dopo l'errore di pubblicazione di un paio di settimane fa, ecco gli SDK Standard e Professional per Windows Mobile 6.0.
La nuova nomenclatura prevede
- una versione Standard che fa rifermento a quanto conosciuto come SmartPhone
- una versione Classic che fa riferimento al Pocket PC classico
- una versione Professional che fa riferimento al Pocket PC Phone Edition
Le lavorate su entrambe le piattaforme (Pocket e SmartPhone) occorre scaricare entrambe le versioni dell'SDK. Contrariamente a quanto si può pensare infatti, Professional non si riferisce alla versione completa, ma appunto alla versione dell'SDK per Pocket PC Phone Edition.
Se si lavora con Vista serve Windows Mobile Device Center, con XP invece Active Sync 4.5. In entrambi i casi .NET CF 2.0 SP1 e Visual Studio 2005 SP1.
Il download inizia da quì: http://www.microsoft.com/downloads/details.aspx?FamilyID=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en
Stavo spulciando la documentazione di IIS 7 per vedere se mi ero perso qualcosa...e in effetti non avevo capito bene una cosa:
Passport authentication
Passport authentication is no longer supported in the Longhorn operating system. Customers using passport should consider moving to its replacement Active Directory Federation Services (ADFS). For more information on ADFS refer to the following whitepaper:
http://www.microsoft.com/WindowsServer2003/R2/Identity_Management/ADFSwhitepaper.mspx.
AZMan
Il meccanismo è stato introdotto in IIS6 per processare le regole di autorizzazione: se non l'avete mai visto/usato...lasciate stare...esiste ancora in IIS7 ma il suo utilizzo è Deprecated.
Articolo pubblicato su week.it del 7 febbraio 2007
SqlCe nasce nel ’98 in versione 1.0. CE sta per Compact Edition o semplicemente per la piattaforma su cui gira, Windows CE appunto. La seconda versione, alla fine del ’99, (chiamato SqlCE 2.0 in tutte le librerie fisiche client e server) prese il nome di Sql Server 2000 Compact Edition oppure SQL Server for Windows CE 2000.
La terza release esce nel novembre 2005 e tanto per complicare le cose il nome varia da SqlCE 3.0 a Sql 2005 Mobile Edition o anche Sql Server 2005 Mobile Edition. Per gli addetti ai lavori è comunque sempre stato SqlCe 3.0 e, dopo sette anni, ne è stato rivisto l’engine e il query processor che ora si basa su meccanismi euristici (a partire dalle statistiche), come nel fratello maggiore Sql Server. Inoltre, consente l’accesso a più connessioni (aperte da più processi o da più thread) aprendo scenari di replica asincrona durante l’uso del database stesso.
Il prodotto può essere distribuito solo su piattaforma Windows CE (e le varie varianti Windows Mobile) e su Tablet Pc, ma non su Pc tradizionali se non affiancato da Visual Studio 2005. In pratica, si può usare su un desktop ai fini di sviluppo e test, ma non in produzione.
Nel gennaio 2006 si iniziò a parlare anche di Sql Everywhere: in pratica Sql Ce senza la limitazione dell’uso solo su Windows Ce (Windows Mobile 5.0 è basato su Windows Ce 5.0), sul Tablet Pc e sulla macchina di sviluppo con Visual Studio. Quindi Sql Everywhere avrebbe avuto la licenza per girare ovunque (teoricamente anche su un server...ove però chiaramente ricopre solo un ruolo marginale :-))
Il nuovo (in realtà mica tanto) prodotto doveva essere appunto Sql Everywhere e girare anche su un normale pc.
Se siete arrivati fin qui senza mal di testa, dimenticate l’ultima parte su SQL Everywhere perché il nuovo SqlCe ritorna al vecchio nome e si chiama Sql Compact Edition versione 3.1 e gira su Windows Ce, Xp Tablet Edition, Xp e Vista. In altre parole può essere distribuito anche su desktop e piattaforme Windows 32. All’interno di Visual Studio, pèrò, trovate le reference alla versione fisica 3.0. La 3.1 si deve considerare quindi come un service pack per questa versione.
Per il futuro sembra che una versione 3.5 verrà rilasciata insieme a Orcas (nome in codice della prossima versione di Visual Studio) e avrà un nuovo motore di replica dei dati che va oltre l’attuale Rda e Merge Replication e che funzionerà solo sulla 3.5 (ma la 3.1 e la 3.5 potranno girare insieme).
In Orcas inoltre dovrebbe esserci anche un subset di quanto troviamo in .Net 3.0, almeno per la parte Windows Communication Foundation e Windows Presentation Foundation e non ultimo una versione ridotta di LinQ.