Pubblicata agenda XeDotNet

by Andrea 27 August 2009 05:34

logo_xedotnet E' stata pubblicata l'agenda con i Community Meeting del prossimo semestre di XeDotNet.

  • 25 Settembre 2009 – PATTERN TRACK
    • Model-View-ViewModel Applied: real world WPF application
    • Model-View-ViewModel e la UI Composition: WPF Power
  • 16 Ottobre 2009 – TFS TRACK
    • Team Foundation Server Database Edition
    • Scrum for Team System, non solo teoria
  • 6 Novembre 2009 – WEB TRACK
    • Windows Communication Foundation: normalizzare e controllare i servizi WCF
    • Silverlight do it better: Silverlight, Ria Services e le LOB Applications
  • 11 Dicembre 2009 – DATA TRACK
    • Entity Framework 4.0: Promessa mantenuta?
    • Dynamic Data 4.0 

Per informazioni e registrazione:
http://www.xedotnet.org/nextmeetings.aspx

Per quanto mi riguarda, terrò la sessione relativa ai Dynamic Data 4  l'11 Dicembre 2009.
La sessione sarà dedicata a casi reali (come è già emerso da chiacchere con alcuni di voi), ma prima di iniziare a preparare il materiale, sarei curioso di sapere come preferireste fosse trattato l'argomento, o quali particolari problematiche vorreste fossero affrontate. 
E mi raccomando, non esitate a contattarmi, proponendo argomenti/esempi di vostro interesse su questa tecnologia, perchè potrebbero essere di interesse comune.

Technorati Tags: ,

Tags: ,

XeDotNet | .NET

Gestione commenti su BlogEngine.NET

by Andrea 20 August 2009 08:26

Una mancanza che ho sempre trovato in BlogEngine.NET era di non avere una gestione centralizzata dei commenti. Per cancellare o approvare un commento si doveva necessariamente farlo dalla pagina del post, che comportava il conoscere esattamente dove fosse stato postato quel commento (link che viene comunicato via mail).

Scaricando l'ultima versione presente in codeplex, nella sezione Source Code(in quanto non è ancora stata rilasiata una release ufficiale) è stata aggiunta la possibilità di visualizzare e gestire i commenti direttamente dalla sezione Admin del proprio blog.
Da questa sezione è possibile infatti visualizzare tutti i commenti, approvarli in caso di moderazione attiva, cancellarli e modificarli (cosa che invece non approvo molto).

La sezione è ancora in fase di sviluppo, me devo ammenttere che funziona perfettamente ed è una grande comodità.

La versione iniziale di BlogEngine.NET che include questa funzionalità è la 1.5.1.17.

Technorati Tags: ,

Tags:

ASP .NET | .NET | Sito

Reporting Services - report snapshots

by andrea 23 July 2009 02:31

Una funzionalità che trovo molto utilie di Reporting Services sono gli Report Snapshots.

Cos'è un report snapshot?

Uno Report Snapshot non è altro che una copia del report, eseguito in un preciso istante. Questa copia conterrà tutte le informazioni necessarie per permettere di visualizzare il report in un secondo momento, e avere lo stato al momento della sua creazione.

Quando viene chiesto di salavare uno snapshots, Reporting Services esegue il report in questione e immagazzina tutte le informazioni che vanno a popolare i dataset utilizzati nel report stesso (e anche il layout del report). In questo modo, quando viene richiesta la visualizzazione di un preciso Snapshot, si hanno a disposizione i dati già elaborati, che erano presenti in quel preciso istante (data + ora).
Ecco cosa viene salvato nel server di Reporting Services:

  • The result set (that is, the data in the report, retrieved through the credentials specified in the Data Sources properties page of the report).
  • The underlying report definition, as it exists at the time the snapshot was created. If the report definition was subsequently modified after the snapshot was generated, those changes are not reflected in the snapshot.
  • Parameter values that are used to obtain or filter the result set.
  • Embedded resources, such as images. External resources that are linked to a report are not stored with the report snapshot.

Un enorme vantaggio, che porta all'uso dei Report Snapshots, è il fatto di poter essere schedulati, ed esistono molte impostazioni possibili a riguardo. (esecuzione a intervalli prestabiliti, in precisi giorni, una sola volta, ...)

I Report Snapshots hanno però anche delle limitazioni, una di queste, è dovuta al fatto che vengono salvanti anche i valori dei parametri, e questo comporta che se vogliamo Snapshot con parametri differenti, si dovranno creare differenti Report (o Linked Reports), ma questo è anche capibile.
In alcune condizioni però, è possibile utilizzare un parametro (visibile) all'interno del report per filtrare i dati. Infatti, il filtro dei dati all'interno del report è una prassi consentita, in quanto viene applicato ai dati che popolano i DataSet (e quindi immagazzinati nello snapshot)

Quando utilizzare i report snapshots?

Possono essere utilizzati prevalentemente per due motivazioni:

  • Si vuole avere uno storico di un determinato report.
    Schedulando la creazione di snapshot a determinati intervalli, permettono di avere esattamente la situazione (il risultato del report) in quel dato momento, e quindi poter eseguire a posteriore una visualizzazione di tali dati.
  • Esecuzione di report che richiedono molto tempo di elaborazione.
    E' possibile schedulare l'esecuzione di snapshot per ovviare al problema dell'attesa per l'elaborazione di report che richiedono un lungo tempo di caricamento. In questo modo, l'utente può visualizzare l'ultimo snapshot eseguito, che verrà caricato velocemente in quanto i dataset sono già stati popolati durante la creazione dello snapshot, risparmiando così l'attesa all'utente.

Come visualizzare uno snapshot nel controllo ReportViewer

Per visualizzare uno snapshot di un preciso report nel controllo ReportViewer è sufficiente impostare la proprietà HistoryId del controllo, con l'ID dello snapshot che si vuole visualizzare.

reportViewer.ServerReport.HistoryId = historyID;

Utilizzando il web service esposto da Reporting Services (Consumare il web service di Reporting Services) è possibile recuperare la lista di Snapshots di un determinato report, e utilizzare i dati ricevuti per recuperare l'identificativo dell'ultimo Snapshot eseguito.
Ecco come poter recuperare la lista di tutti gli snapshot di un determinato report:

   1: public ReportHistorySnapshot[] GetReportHistory(string reportFullPath)
   2: {
   3:   using (ReportingService2005SoapClient rs = ReportingService2005SoapClient())
   4:   {
   5:       rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
   6:       rs.ClientCredentials.Windows.ClientCredential.UserName = "username";
   7:       rs.ClientCredentials.Windows.ClientCredential.Password = "password";      
   8:  
   9:       ReportHistorySnapshot[] snapshots = null;
  10:       rs.ListReportHistory(reportFullPath, out snapshots);
  11:  
  12:       return snapshots;
  13:   }
  14: }

Link:

Tags: ,

SQL Server | .NET | Reporting Services

Visualizzare e nascondere un PopupControlExtender da una funzione server side

by Andrea 20 July 2009 08:55

Qualcuno ha posto la domanda, se fosse possibile visualizzare o nascondere un popup creato con il PopupControlExtender direttamente da una funzione server side.

A differenza del ModalPopupExtender, PopupControlExtender il  non dispone di queste funzionalità server side, ma con poche righe di codice si può aggirare la problematica.

Per fare questo dobbiamo valorizzare la proprietà BehaviorID dell'extender:

   1: <ajax:PopupControlExtender 
   2:   ID="popup"
   3:   runat="server" 
   4:   BehaviorID="popupExt" ... />

utilizzando i metodi client showPopup e hidePopup, possiamo registrare uno script che si occupi di far visualizzare o nascondere il popup. Lo script utilizzerà la funzione $find per cercare l'extender all'interno del DOM della pagina, e successivamente verrano chiamate le funzioni showPopup oppure hidePopup esposte dallo script dell'extender.

Grazie al metodo RegisterStartupScript esposto dallo ScriptManager possiamo registrare lo script che immadiatamente verrà eseguito alla fine del postback.

   1: // visualizzare il popup
   2: ScriptManager.RegisterStartupScript(this, this.GetType(), "showPopup", "$find('popupExt').showPopup();", true);
   3:  
   4: // nascondere il popup
   5: ScriptManager.RegisterStartupScript(this, this.GetType(), "hidePopup", "$find('popupExt').hidePopup();", true);

 

Tags: ,

.NET | ASP .NET | ASP.NET AJAX

Consumare il web service di Reporting Services

by andrea 16 July 2009 08:05

Ecco come utilizzare il web service di Reporting Services (utilizzando basicHttpBinding)
(sia per Reporting Services 2005 che per Reporting Services 2008)

Per poter utilizzare il (uno dei) web service esposto da Reporting Serives, si dovrà creare una Service Reference facendola puntare all'url
http://127.0.0.1/reportserver/ReportService2005.asmx?wsdl
dove 127.0.0.1 sarà l'IP della macchina dove è installato Reporting Services.

Aggiunta la referenza, verrà automaticamente generata la configurazione all'interno dell'app.config, e nell'elemento basicHttpBinding saranno da modificare:

  • in binding --> security: modificare l'attributo mode in TransportCredentialOnly
  • in binding --> security --> transport: impostare clientCredentialType e proxyCredentialType a Ntlm

La configurazione finale sarà quindi la seguente:

   1: <system.serviceModel>
   2:     <bindings>
   3:         <basicHttpBinding>
   4:             <binding name="ReportingService2005Soap" closeTimeout="00:01:00"
   5:                 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
   6:                 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
   7:                 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
   8:                 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
   9:                 useDefaultWebProxy="true">
  10:                 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  11:                     maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  12:                 <security mode="TransportCredentialOnly">
  13:                     <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"
  14:                         realm="" />
  15:                     <message clientCredentialType="UserName" algorithmSuite="Default" />
  16:                 </security>
  17:             </binding>
  18:         </basicHttpBinding>
  19:         <customBinding>
  20:             <binding name="ReportingService2005Soap12">
  21:                 <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
  22:                     messageVersion="Soap12" writeEncoding="utf-8">
  23:                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  24:                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  25:                 </textMessageEncoding>
  26:                 <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
  27:                     maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Ntlm"
  28:                     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
  29:                     keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Ntlm"
  30:                     realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
  31:                     useDefaultWebProxy="true" />
  32:             </binding>
  33:         </customBinding>
  34:     </bindings>
  35:     <client>
  36:         <endpoint address="http://127.0.0.1:80/ReportServer/ReportService2005.asmx"
  37:             binding="basicHttpBinding" bindingConfiguration="ReportingService2005Soap"
  38:             contract="ReportingServices.ReportingService2005Soap" name="ReportingService2005Soap" />
  39:     </client>
  40: </system.serviceModel>

Ora, per poter invocare i metodi del web service è necessario impersonare un utente della macchina di Reporting Services (che abbia i diritti correttamente impostati), andando a settare i valori nelle rispettive proprietà della classe ClientCredentials.

Impersonato l'utente, sarà poi possibile invocare i metodi esposti dal servizio.

   1: using (ReportingService2005SoapClient rs = new ReportingService2005SoapClient())
   2: {
   3:     rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
   4:     rs.ClientCredentials.Windows.ClientCredential.UserName = "username";
   5:     rs.ClientCredentials.Windows.ClientCredential.Password = "password";
   6:     rs.ClientCredentials.Windows.ClientCredential.Domain = "domain";    
   7:  
   8:     CatalogItem[] items = null;
   9:     rs.ListChildren("/", true, out items);
  10:     // [...]
  11: }

Alcune ulteriori informazioni le potete trovare al seguente link:
Reporting Services Web Service

Per un progetto a cui stò lavorando, ho dovuto fare uno studio per alcune funzionalità che dovevano pesantemente interagire con il web service di Reporting Services.
Ho notato che le informazioni in rete sono un pò sparse e frazionate, e quindi mi è sembrato utile scrivere due righe per aiutare chi fosse ai primi passi (su questa problematica).

Tags:

ASP .NET | .NET | SQL Server | Reporting Services

Extension BlogEngine.NET to ping.fm

by andrea 16 July 2009 01:59

Comunicare la presenza di nuovi post nei vari social network è una cosa diffusa, c'è chi lo fa su twitter, chi su facebook, e chi su altri portali.
Non volendo "perdere tempo" a comunicare il post nei vari social network, ho sviluppato un'extension per BlogEngine.NET che lo fa al posto mio utilizzando le API di  ping.fm.

ping_do_fm_logo_2

Ping.fm is a simple and FREE service that makes updating your social networks a snap!

Per chi non conoscesse ping.fm, questo è un'applicazione web che permette di aggiornare più di 40 social network da un unico punto centralizzato. Espongono anche delle API che chiunque può utilizzare da una propria applicazione, ed è questa la strada che ho scelto per questa extension, avendo l'enorme vantaggio di non dovermi gestire io la comunicazione con tutti i vari portali.

L'extension è appena stata approvata, e quindi ora chiunque abbia BlogEngine.NET e abbia un account su ping.fm la potrà utilizzare.

Le impostazioni sono molto semplici, è richiesta la User Application Key, che viene fornita a questo indirizzo http://ping.fm/key/, e poi con dei tag <title>, <link> e <body> sarà possibile configurare il template del messaggio.

Per scaricare l'extension ecco il link:
BlogEngine.NET to ping.fm

 

 

Tags: , ,

.NET | ASP .NET | Sito | Internet

BlogEngine.NET CheckComment Extension

by andrea 14 July 2009 05:30

Ho realizzato una semplice extension per BlogEngine.NET che permette di annullare l'inserimento di un commento in alcune condizioni:

  • arrivano da IP precisi.
  • contengono determinate parole.
  • contengono link.

ovviamente il tutto è gestibile dalla pagina delle impostazioni dell'extension, e può essere abilitata solo in parte.

Questa extension nasce dal fatto che alcuni commenti di spam riescono a passare il sistema di captcha di BlogEngine.NET, spesso arrivano dagli stessi IP, e quindi trovo questo sia il modo più veloce per risolvere la cosa.

Unica nota dolente, è che nel caso non si voglia applicare un filtro, di dovrò inserire il carattere virgola (,) in quanto la versione attuale di BlogEngine.NET vede tutti i campi come obbligatori.

Per scaricare l'extension ecco il link: BlogEngine.NET CheckComment Extension

Technorati Tags: ,

Tags: ,

ASP .NET | .NET | Sito

Codice e slide: Web Congress 2.0 - Dynamic Data

by Andrea 21 June 2009 13:37

Ecco qui disponibile il download del codice sorgente e delle slide del Web Congress 2.0 di venerdì 27 Marzo 2009 della mia sessione sui ASP.NET Dynamic Data

Slide: downlaod
Codice: download

Tags: , ,

XeDotNet | .NET | ASP .NET

Codice e slide: Community Meeting - Programming C# 3.0

by Andrea 21 June 2009 13:37

Ecco qui disponibile il download del codice sorgente e delle slide del Community Meeting di venerdì 5 giugno 2009 su Programming C# 3.0.

Slide: downlaod
Codice: download

DSC_0731DSC_0736DSC_0737

 

Tags: , ,

.NET | XeDotNet

Community Meeting: Programming C# 3.0

by andrea 04 June 2009 00:30

Domani, 5 giugno 2009 terrò a Mestre l'evento Programming C# 3.0:

Con il lancio di Visual Studio 2008 e del .NET Framework 3.5 anche il linguaggio C# ha subito un'importante evoluzione. Conoscere questi cambiamenti permette agli sviluppatori di poter scrivere del codice più pulito, leggibile e performante. In questa sessione andremo in dettaglio sulle nuove funzionalità introdotte in C# 3.0 e con esempi pratici scopriremo quali sono i vantaggi che esse portano allo sviluppatore, ma anche al codice prodotto.

  • Auto-Implemented Properties
  • Partial Method Definitions
  • Extension Methods
  • Implicitly Typed Local Variables and Arrays
  • Object Initializers
  • Collection Initializers
  • Anonymous Method
  • Lambda Expressions
  • Anonymous Types
  • Linq
  • Query Expression
  • Expression tree

…e questa è una buona occasione per conoscere per bene tutte le funzionalità di C# 3.0 prima della vicina uscita della versione 4, che porterà ulteriori novità.

Vi aspetto e vi ricordo che per registrarvi il link è il seguente:
http://www.xedotnet.org/meet/csharp.aspx

Technorati Tags: ,,

Tags: , ,

Microsoft | XeDotNet | .NET