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

Community Meeting: .netTiers & Code Generation

by andrea 08 May 2009 00:55

netTiersLogo Ricordo a tutti, che questa sera si terrà il community meeting .netTiers & Code Generation tenuto da Davide Senatore. L'evento si terrà presso il Novotel di Mestre alle ore 19:00.

Per chi come me non conosce .netTiers, consiglio la lettura degli ultimi due post scritti da Davide Senatore:

devo ammettere che la lettura di questi post ha aumentato il mio interesse sull'argomento, e chissà che Davide riesca ad allontanare lo scetticismo che ho verso questo genere di tool.

Non ci rimane che darci appuntamento a questa sera.
Vi ricordo a tutti che dopo il meeting, continueremo la serata presso "lo scarpon" sempre a Mestre... e un bel disco volante non me lo leva nessuno. :-D

Tags: , ,

ASP .NET | .NET | XeDotNet

Risolto errore nei commenti

by andrea 28 April 2009 02:40

Mi è stato segnalato che era presente un errore che non permetteva di commentare i post:

'BlogEngine.comments.nameBox.value' is null or not an object

L'errore è presente nella versione 1.5.0.7 di BlogEngine.NET che avevo prelevato da codeplex circa un mese fa. Ho provveduto ad aggiornare il blog con l'ultima versione presente (al momento la 1.5.1.3) ed il problema è stato risolto.

Inoltre, segnalo che è stata anche rilasciata una nuova versione "stabile" di BlogEngine.NET, ed è la 1.5, raggiungibile a questo link: BlogEngine.NET 1.5 final

Technorati Tags:

Tags:

Sito | Internet | ASP .NET

Extension per BlogEngine - Meta Description

by andrea 15 April 2009 02:39

E' da parecchio tempo che seguo il progetto BlogEngine.NET e che ne faccio uso per questo blog. Con le prime versione, mi sono dovuto scrivere un bel pò di codice per adattarlo alle mie esigenze, e sopratutto per ottimizzarlo per l'indicizzazione nei motori di ricerca.
(SEO - Ottimizzazione per i motori di ricerca)
Ad ogni aggiornamento di BlogEngine.NET, mi accorgevo che il codice (scritto da me) che stavo riportando da una versione all'altra, si riduceva notevolmente. Fino a pochi giorni fa, che sono riuscito a inserire tutto il mio codice all'interno di una Extension, permettendomi d'ora in poi di agevolarmi nella procedura di aggiornamento (che ora si è ridotta ad un bel copia e incolla).

L'extension che ho creato permette di settare il tag meta-description della pagina con i primi 200 caratteri del post. Questo tag permette di specificare una descrizione per il contenuto della pagina migliorandone l'indicizzazione.

Creare l'Extension

Per fare questo, mi sono agganciato all'evento Serving del Post, ed al suo interno ho eliminato i tag html contenuti nel Body, e copiato i primi 200 caratteri all'interno della proprietà Description (che di default viene inserita nel tag meta description della pagina).

   1: /// <summary>
   2: /// Initializes the <see cref="MetaDescription"/> class.
   3: /// </summary>
   4: static MetaDescription()
   5: {
   6:     Post.Serving += new EventHandler<ServingEventArgs>(Post_Serving);
   7: }
   8:  
   9: /// <summary>
  10: /// Handles the Serving event of the Post control.
  11: /// </summary>
  12: /// <param name="sender">The source of the event.</param>
  13: /// <param name="e">The <see cref="BlogEngine.Core.ServingEventArgs"/> instance containing the event data.</param>
  14: static void Post_Serving(object sender, ServingEventArgs e)
  15: {
  16:     if (!string.IsNullOrEmpty(e.Body)
  17:         && string.IsNullOrEmpty(((Post)sender).Description)
  18:         && e.Location == ServingLocation.SinglePost)
  19:     {
  20:         // Remove the HTML tags
  21:         string content = ClearHTMLTags(HttpUtility.HtmlDecode(e.Body));            
  22:         
  23:         // Remove the encoded char. es: &#236; 
  24:         //content = ClearEncodedChar(HttpUtility.HtmlEncode(content));
  25:  
  26:         // Reduce the Length of text for meta description
  27:         if (content.Length > 200)
  28:             content = content.Substring(0, 200);
  29:  
  30:         // Set the description of post
  31:         ((Post)sender).Description = content;
  32:     }
  33: }

Rimuovere i tag HTML

Per elinare i tag HTML contenuti nel post ho utilizzato le Regular Expression, in quanto sono veramente performanti, e permettono agevolmente di eseguire ricerche e modifiche all'interno di testi scrivendo pochissime righe di codice:

   1: /// <summary>
   2: /// Clears the HTML tags.
   3: /// </summary>
   4: /// <param name="strHTML">The string with the tags to remove.</param>
   5: /// <returns></returns>
   6: private static string ClearHTMLTags(string strHTML)
   7: {
   8:     Regex regEx = null;
   9:     string strTagLess = string.Empty;
  10:     try
  11:     {
  12:         //this pattern mathces any html tag
  13:         regEx = new Regex("<[^>]*>", RegexOptions.IgnoreCase);
  14:         strTagLess = regEx.Replace(strHTML, "");
  15:         //matches a single <
  16:         regEx = new Regex("[<]", RegexOptions.IgnoreCase);
  17:         strTagLess = regEx.Replace(strTagLess, "&lt;");
  18:         //matches a single >
  19:         regEx = new Regex("[>]", RegexOptions.IgnoreCase);
  20:         strTagLess = regEx.Replace(strTagLess, "&gt;");
  21:  
  22:         return strTagLess;
  23:     }
  24:     catch
  25:     {
  26:         return strHTML;
  27:     }
  28: }

Rimuovere caratteri speciali

All'interno del codice del metodo Post_Serving, è presente una riga di codice commentata che punta a una funzione che permette (sempre tramita Regular Expression) di rimuovere i caratteri speciali/simboli presenti all'interno del post. Questo perchè vengono visualizzati con l'encoding e quindi il carattere "é" apparirebbe "&amp;#233;" (in quanto viene fatto un (doppio) encoding da BlogEnigne.NET). Questa informazione viene comunque interpretata correttamente dai motori di ricerca, e quindi ho preferito non rimuovere questi caratteri, ma per chi invece fosse interessato, è sufficiente che scommenti la linea.
Ecco qui la funzione che verrebbe eseguita:

   1: /// <summary>
   2: /// Clears the encoded char.
   3: /// </summary>
   4: /// <param name="strHTML">The string with encoded char to remove</param>
   5: /// <returns></returns>
   6: private static string ClearEncodedChar(string strHTML)
   7: {
   8:     Regex regEx = null;
   9:     string strEncodedCharLess = string.Empty;
  10:     try
  11:     {
  12:         regEx = new Regex(@"&(?ni:\#((x([\dA-F]){1,5})|(104857[0-5]|10485[0-6]\d|1048[0-4]\d\d|104[0-7]\d{3}|10[0-3]\d{4}|0?\d{1,6}))|([A-Za-z\d.]{2,31}));", RegexOptions.IgnoreCase);
  13:         strEncodedCharLess = regEx.Replace(strHTML, "");
  14:  
  15:         return strEncodedCharLess;
  16:     }
  17:     catch
  18:     {
  19:         return strHTML;
  20:     }
  21: }

Come utilizzare l'extension

Per utilizzare l'extension, non si deve fare altro che eseguire il download, e copiare il file contenuto all'interno della cartella \App_Code\Extensions del proprio blog.

Download file: http://files.dott.../BlogEngine-MetaDescription-01.zip

Tags: , ,

ASP .NET | .NET | Microsoft

Guida BlogEngine.NET

by andrea 14 April 2009 00:25

guida_BlogEngine Segnalo che sono usciti i primi articoli della "Guida BlogEngine.NET" che ho scritto per HTML.it.

BlogEngine.NET è una piattaforma di blogging, la stessa che utilizzo io per questo blog (blog.dottor.net), e viste le numerose domande che ho ricevuto a riguardo dell'installazione, customizzazione ed integrazione/espansione, ho colto al volo la possibilità di scrivere questa guida, che spero possa essere utili a molti di voi. (e pensare che all'inizio si trattava di un unico articolo...)

BlogEngine_logo Ho fatto il possibile per rendere la guida il più semplice possibile, in modo da poter aiutare chi è alle prime armi con .NET, ma non solo. Nella guida, infatti, sono trattati anche argomenti sul come customizzare BlogEngine.NET con la propria grafica e sul cosa si deve fare per espandere l'applicazione aggiungendo delle proprie funzionalità (extensios), che secondo me, sono le grandi potenzialità di questa piattaforma. (che usciranno prossimamente)

Il link alla guida è il seguente "Guida BlogEngine.NET", e per qualunque domanda/critica potete contattarmi senza problemi.

Technorati Tags:

Tags: ,

ASP .NET | .NET | Microsoft

Web Congress 2.0 - Ci vediamo tra poco

by andrea 27 March 2009 02:19

WebCongress2Slide preparate…
…e come al solito le ho terminate questa notte. Devo ancora capire perchè posso iniziarle anche un mese prima degli eventi, ma mi ritrovo a far modifiche fino all'ultimo momento. :D

Codice fatto…   
…di questo ne vado abbastanza fiero. Sono riuscito ad applicare i DynamicData ad un caso reale (aggiungendo un'area per gestire quest'applicazione), ma non voglio svelare troppo.

e quindi tutto è pronto…ci vediamo questo pomeriggio al Web Congress.

Technorati Tags: ,

Tags: , , ,

ASP .NET | .NET | XeDotNet

Seadragon Ajax

by andrea 13 March 2009 01:56

Leggendo il post di Mike Ormond sono venuto a conoscenza che Microsoft Live Labs  ha sfornato un nuovo progetto che ha dell'incredibile, dal nome Seadragon Ajax.

logo_color_seadragon_90 Questo progetto è una "replica" di Deep-Zoom, la funzionalità realizzata per silverlight che vi permette di gestire una foto grande quanto un campo da calcio, ed eseguire lo zoom fino al minimo particolare. Ma a differenza di Deep-Zoom questa è una funzionalità AJAX, che si appoggia completamente a JavaScript.

Ecco il link per vedere il progetto: http://livelabs.com/seadragon-ajax/

Tags: ,

ASP .NET | ASP.NET AJAX