giugno 2006 Entries
Quando sviluppare in ASP.NET diventa frustrante

L'ultima volta che ho criticato un certo ambiente di sviluppo concorrente di Visual Studio c'è stata la chiamata alle armi. Vediamo un po' cosa accade questa volta, speriamo che la cosa passi inosservata

Devo fare una piccola web-app di tre pagine, sono vincolato ad utilizzare il suddetto ambiente e quindi ASP.NET 1.1 (perché manca tutt'ora il supporto alla più recente versione 2.0). Per emulare il funzionamento delle master pages, ho usato il solito (ed elementare) sistema dei due UserControl, un header ed un footer, che quindi per forza di cose arrivano ad avere al loro interno dei tag HTML che restano aperti.

Primo ostacolo: il nuovissimo IDE, rilasciato solo da qualche mese, non gradisce tali tag e quindi forzatamente li chiude ad ogni click sul pulsante "Save". Ho pistolato un po' sulle opzioni, cercato qualcosa su google, ma non ho trovato granché... Quindi tocca metterci mano con il Notepad. Va be'... lascio perdere, e proseguo (anche se un po' scocciato).

Il folder principale della mia applicazione ha una stupenda pagina dal fantomatico nome di Default.aspx. Creo un subfolder, faccio per creare una nuova pagina Default.aspx al suo interno e.... Ta-DA!! Errore dell'IDE, che solleva un'eccezione non gestita (con tanto di stack-trace) informandomi candidamente che esiste già nel progetto un file dal nome Default.aspx!!!! Incredibile!!

Chiosa finale: premesso che magari è colpa mia e che sicuramente il sottoscritto s'è perso qualche opzione per strada risolutiva di tutte le mie grane, ma, se così non fosse, avrebbe senso un supporto del genere? o è messo lì solo per dire: "ehy, con il nostro IDE puoi sviluppare anche su ASP.NET 1.1"? Ok... ora flagellatemi pure.

powered by IMHO 1.3

15 Comments Filed Under [ Misc ]
Persistere il ViewState sul database (o dove ci pare)
Il viewstate di ASP.NET alle volte è una gran comodità, che però paghiamo in termini di prestazioni ad ogni postback, dato che un bel campo hidden di grandezza che a volte può essere considerevole, è costretto ad andare avanti e indietro tra client e server.

Click sul titolo per leggere
6 Comments Filed Under [ .Net 2.0 ASP.NET 2.0 ]
Creare un certificato per testare il proprio sito in HTTPS

Non sono espertissimo di sviluppo web, dato che il mio background appartiene fondamentalmente al mondo delle winforms, però da un paio d'anni a questa parte sto cercando di colmare le mie lacune, sia con qualche lavoretto, più che altro con parecchio studio.  

Mi son trovato nella necessità di attivare il protocollo HTTPS sulla mia macchina di testing in ufficio. Trovandomi nell'impossibilità di

  1. Installare e compilare Open SSL
  2. Installare i Certificate Services di Win2k3

ho pensato subito di avvalermi del tool Makecert.exe per generare un certificato. Ho trovato due ottimi post sull'argomento (che onestamente m'è sembrato tutt'altro che banale) sul blog di John Howard, che vi segnalo

https://209.34.241.68/jhoward/archive/2005/02/02/365323.aspx

https://209.34.241.68/jhoward/archive/2005/02/04/366883.aspx

BTW, complice la mia proverbiale pigrizia, gironzolando qua e là per la rete mi sono imbattuto in un tool di cui non avevo mai sentito parlare e che mi è stato *utilissimo*: IIS Diagnostics Toolkit

Tra le varie features, permette con un semplice click-dx, di generare automaticamente un certificato di test della durata di due settimane ed installarlo in IIS. Grande!!!

powered by IMHO 1.3

2 Comments Filed Under [ Misc ]
WebServices su HTTPS

Quella passata è stata una settimana a dir poco massacrante, in cui non ho avuto un solo attimo di respiro (weekend compreso). Per fortuna mi sono buttato alcuni impegni alle spalle e all'una e spiccioli di domenica sera ho finalmente il tempo per

  1. installare Windows Vista Beta 2 (perché io sono tra i comuni mortali che per il momento non hanno a disposizione un abbonamento MSDN)
  2. Bloggare un po'

Nelle attività che ho svolto ultimamente, mi sono ritrovato nella necessità di invocare un Web Service sotto https senza che il server avesse a disposizione un certificato riconosciuto (il tipico caso in cui, se navigassimo con il browser, beccheremmo un bel warning con dialog box che ci chiede se vogliamo proseguire o meno).

Se però stiamo accedendo ad un webservice da codice, ovviamente, non c'è nessuna dialog che ci proponga una qualche scelta, bensì l'invocazione risponde picche e solleva un'eccezione. Come ovviare? Ho trovato una risposta nel blog di Jan Tielens, ed è raggiungibile clickando qui

powered by IMHO 1.3

Add Comment Filed Under [ .Net 2.0 ASP.NET 2.0 ]
Validation Application Block 0.4 Released

Validare le vostre domain entities è sempre stato un problema? Implementare constraints in maniera dichiarativa è il vostro sogno? Benissimo... abbiamo quello che fa per voi!

Siore e siori... Validation Application Block 0.4

Il Validation Application Block grazie agli sforzi miei e di Andrea arriva alla release 0.4 e, per l'occasione, migra su SourceForge. Le novità introdotte rispetto alla versione precedente riguardano essenzialmente architettura e naming (già, naming, purtroppo vi toccherà ritoccare qua e là il codice, se utilizzavate la 0.3), ed in particolare:

  1. Architettura: è stato aggiunto un supporto alle validation rules (per il momento a livello embrionale e purtroppo non ancora utilizzabile) che, al fine di evitare duplicazioni di codice, ha richiesto la riscrittura di tutti gli attributi, che ora non sono altro che wrapper alle rules corrispondenti
  2. Naming: ogni attributo ora presenta il suffisso "constraint" piuttosto che "validator"

In realtà tutto ciò ci ha permesso di rendere più "consistente" la struttura delle classi, suddivise come dev'essere tra constraints e rules, aprendo così la strada all'implementazione di un framework di contextual validation.

Come Andrea ha più volte rimarcato, il tutto è rilasciato sotto Common Public License 1.0 ed è *graditissima* una qualsiasi forma di aiuto da parte di chiunque abbia la volontà di dedicare a questo progetto un po' del suo tempo libero. Quindi... se rientrate nella categoria, non vergognatevi e contattate o me o Andrea, saremo felicissimi di accogliervi nella famiglia (e farvi smazzare di lavoro ).

powered by IMHO 1.3

Thunderbird e i feed che si moltiplicano

Sul computer di casa avevo già dovuto alzare bandiera bianca qualche mese fa, mentre il pc dell'ufficio resisteva ancora... fino ad oggi. Di cosa parlo? Ma di un fastidioso bug di Thunderbird che mi scarica ad ogni startup sempre *tutti* i feed, duplicandomi tutto e costringendomi ogni volta a cancellare un migliaio di post

Il problema non sembra di facile soluzione, dato che anche sul forum sembrano non saper che pesci pigliare. BTW, ho trovato un'utilissima extension che rimuove i post duplicati. Personalmente non l'ho ancora provata, magari ci darò un'occhiata, magari no... dato che ho colto l'occasione per provare il nuovo Outlook 2007

Capperi, abbandono Mozilla per tornar da Microsoft, sta a vedere che ci scappa un'altra polemicona tipo quella a proposito di Borland 

powered by IMHO 1.3

Add Comment Filed Under [ Misc ]
Ancora sui Mock objects

Espando un pochino il concetto espresso nel precedente post a beneficio di chi sia ignaro della questione

Nel mio caso specifico, ho la necessità di connettermi ad un servizio remoto che mi restituisce un documento XML, che viene poi a sua volta interpretato per creare una serie di entities del mio object model. La classe di cui può avvalersi l'utilizzatore per ottenere le previsioni del tempo accetta nel costruttore un oggetto di tipo IWeatherConnector, che sarà poi fisicamente responsabile di inviare una richiesta Http, ottenere una risposta e restituire l'XML di processare:

public class WeatherProvider: IWeatherProvider
{
    
public WeatherProvider(IWeatherConnector connector)
    {
        ....
    }

    
public CurrentConditions GetCurrentConditions
        (
string locationId, UnitType unitType)
    {
        
// metodo da testare, in cui utilizzo l'istanza di
        // IWeatherConnector passata nel costruttore
    
}

    
public Forecast[] GetForecasts
        (
string locationId, UnitType unitType, int days)
    {
        
// altro metodo da testare... stesse caratteristiche 
        // del precedente
    
}
}

Ora... nel mio Unit Test voglio verificare che il metodo GetCurrentConditions riesca ad effettuare il parsing dell'XML in maniera corretta, restituendo l'istanza di CurrentConditions che mi aspetto. Come posso fare? sicuramente non posso collegarmi ogni volta a Weather.com per eseguire i test, perché il collegamento potrebbe essere down, il mio test fallirebbe, otterrei un rosso, ma il mio metodo magari funziona benissimo, avrei quindi un test dal risultato *NON DETERMINISTICO* perché influenzato da fattori esterni!

Cosa fare allora? ho bisogno di un Mock Object, di un IWeatherConnector fittizio che mi permetta di isolare la mia classe e di testarla autonomamente. Ho usato NMock (perché avevo già un piccolo esempio di Andrea, come detto), in realtà ne esistono altri, tra cui Rhino-Mocks del bravo Ayende Rahien (sì, lo stesso di NHibernate Query Analyzer). NMock dicevo... bene... lo uso nella Fixture per costruire il mio connector fasullo:

private IWeatherConnector getWorkingConnector(string expectedResponse)
{
    DynamicMock mockGenerator = 
new DynamicMock(typeof(IWeatherConnector));

    XmlDocument resp = 
new XmlDocument();
    resp.LoadXml(expectedResponse);
    mockGenerator.SetupResult("InvokeService", resp, 
new Type[] { typeof(string) });
    
return (IWeatherConnector) mockGenerator.MockInstance;
}

Con 5 (CINQUE) righe di codice, dico a NMock di generare un tipo che implementi IWeatherConnector, così che possa usarlo nel costruttore della classe da testare, e che, eseguendo il metodo InvokeService restituisca la risposta expectedResponse specificata come parametro. E se volessi controllare come si comporta la mia classe under test se il connector solleva un'eccezione?

private IWeatherConnector getBrokenConnector()
{
    DynamicMock mockGenerator = 
new DynamicMock(typeof(IWeatherConnector));

    mockGenerator.ExpectAndThrow("InvokeService", 
        
new TimeoutException(), new Type[] { typeof(string) });
    
return (IWeatherConnector)mockGenerator.MockInstance;
}

Ora dico al mockGenerator che l'istanza generata deve sollevare una TimeoutException ad ogni esecuzione del metodo InvokeService!

Mica male, eh?

powered by IMHO 1.3

10 Comments Filed Under [ .Net 2.0 Misc ]
TDD webcast e previsioni del tempo

Nel weekend ho lavorato ad una piccola libreria per PockePC che interroga un servizio in rete per ottenere le previsioni del tempo ed è stata un'altra occasione per esercitarsi con il Test Driven Development.

Ora, c'è da dire che sono ancora TAAAAANTO agli inizi, e che, alle volte, può non essere immediato isolare le singole unit da testare, liberandole dalle dipendenze che esse possono avere. Nella fattispecie, ho voluto fare in modo che la mia classe che interroga il servizio e restituisce un oggetto che ne rappresenta la risposta, non dovesse per forza collegarsi in rete per essere testata.

Stavo quasi per fare a mano un "FakeConnector", quando mi sono ricordato di un vecchio webcast di Andrea, proprio sullo Unit Testing, in cui tra le altre cose si accennava ad NMock. Ho ripreso il mio quaderno di appunti (sì, prendo appunti durante i webcast, quando posso ) e ho seguito i consigli del presidente (chissà come gli è venuta di tifare Inter... boh!!! ), realizzando in maniera del tutto automatizzata un bel connector fittizio, che restituisce di volta in volta la risposta che gli chiedo di restituire (e se voglio solleva pure un'eccezione!!).

Se siete agli inizi con il mondo del testing, consiglio veramente di riascoltarlo! Lo trovate qui!

powered by IMHO 1.3

One Comment Filed Under [ Architettura Misc ]
Leggiucchiavo Punto Informatico e....

...guardate un po' cosa trovo: http://punto-informatico.it/pbox.asp?id=1509188

Che dire, complimenti a Mighell, Fabio e tutti gli altri ragazzi di .netSide!

Continuate così!!

powered by IMHO 1.3

2 Comments Filed Under [ Misc ]